123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #!/usr/bin/python3
- import mido
- import sys,os,time
- import _thread
- #timidity -iA -B4,8 -OsSu1 --resample=l -a --voice-lpf=d --noise-shaping=0 --default-program=2 -s 44kHz
- # -V 0.3 --output-mono --volume=255 -V 0.3
- print("out put ports:")
- for i in mido.get_output_names():
- print(i)
- print("input ports")
- for i in mido.get_input_names():
- print(i)
- outport, inport = None,None
- default_output= "TiMidity:TiMidity port 0"
- default_input = "AXELVOX KEY49J:AXELVOX KEY49J MIDI 1 32:0"
- import tkinter as tk
- from tkinter import ttk
- from tkinter import *
- vSplitTheKeybaord = False
- vSplitTheKeybaordFromNum = 55
- vProgram1Num = 81
- vProgram2Num = 10 # 45 82 88 91 92 96 94 98 | 103 105 114
- vSplitKeyBoardTransponse1 = -12
- vSplitKeyBoardTransponse2 = 0
- vVelocityControl = False;
- vReplaceValue = 127;
- def stopAll():
- if outport == None:
- return
- print(vProgram1Num,vProgram2Num)
- for i in range(127):
- outport.send( mido.Message('note_off',channel=0, note=i ) )
- outport.send( mido.Message('note_off',channel=1, note=i ) )
- def apply():
- global vSplitTheKeybaord, vSplitTheKeybaordFromNum, vProgram1Num, vProgram2Num, vSplitKeyBoardTransponse1, vSplitKeyBoardTransponse2,vVelocityControl
- if outport == None:
- return
- #
- stopAll()
- #
- vSplitTheKeybaord = fvsplitkeyboard.get()
- vSplitTheKeybaordFromNum = int(fvSplitKeyBoardFromNum.get())
- vSplitKeyBoardTransponse1 = int(fvSplitKeyBoardTransponse1.get())
- vSplitKeyBoardTransponse2 = int(fvSplitKeyBoardTransponse2.get())
- vVelocityControl = fvVelocityControl.get();
- vProgram1Num = int(Programm1.get())
- vProgram2Num = int(Programm2.get())
- outport.send( mido.Message('program_change', channel=0, program=vProgram1Num) )
- #time.sleep(0.25)
- outport.send( mido.Message('program_change', channel=1, program=vProgram2Num) )
- print('clicked')
- #control_change channel=0 control=7 value=48 t
- def mainloop():
- global outport, inport,vReplaceValue
- try:
- outport = mido.open_output( voutput.get() )
- inport = mido.open_input( vinput.get() )
- fbConnect["text"] = "disconnect"
- except:
- return;
- apply()
- for msg in inport:
- if msg.type in ['note_on', 'note_off']:
- if vSplitTheKeybaord:
- if msg.note > vSplitTheKeybaordFromNum:
- msg.channel=1
- msg.note+= vSplitKeyBoardTransponse2
- else:
- msg.channel=0
- msg.note+= vSplitKeyBoardTransponse1
- if vVelocityControl:
- msg.velocity = vReplaceValue;
- if msg.type == 'control_change':
- vReplaceValue = msg.value
- value_var.set( vReplaceValue );
-
- print(msg)
- outport.send(msg)
- def connect():
- global outport,inport;
- #fbConnect["state"] = "disabled"
- if outport != None:
- outport.close()
- inport.close()
- fbConnect["text"] = "connect"
- time.sleep(0.25)
- outport = None;
- inport = None;
- return
- try:
- _thread.start_new_thread(mainloop, ())
- except:
- print ("Error: unable to start thread")
- return
- root = Tk()
- root.geometry('320x200')
- #root.configure(background='#F0F8FF')
- root.title('Split midi keyboard for timidity')
- deffont=('arial', 12, 'normal')
- Button(root, text='Apply', font=deffont, command=apply ).place(x=220, y=30)
- fbConnect = Button(root, text="Connect", font=deffont, command=connect )
- fbConnect.place(x=220, y=60)
- Button(root, text='StopNotes', font=deffont, command=stopAll ).place(x=220, y=90)
- fvProgramm1 = IntVar(root)
- fvProgramm1.set(vProgram1Num)
- fvProgramm2 = IntVar(root)
- fvProgramm2.set(vProgram2Num)
- fvsplitkeyboard = BooleanVar(root)
- fvsplitkeyboard.set(True)
- fvSplitKeyBoardFromNum = IntVar(root)
- fvSplitKeyBoardFromNum.set(vSplitTheKeybaordFromNum)
- fvSplitKeyBoardTransponse1 = IntVar(root)
- fvSplitKeyBoardTransponse1.set(vSplitKeyBoardTransponse1)
- fvSplitKeyBoardTransponse2 = IntVar(root)
- fvSplitKeyBoardTransponse2.set(vSplitKeyBoardTransponse2)
- Label(root, text='Ch1 Prgm:', font=deffont).place(x=10, y=10)
- Label(root, text='Ch2 Prgm:', font=deffont).place(x=100, y=10)
- Programm1= Spinbox(root, textvariable=fvProgramm1, from_=0, to=128, font=deffont, width=3, command=apply)
- Programm1.place(x=10, y=30)
- Programm2= Spinbox(root, textvariable=fvProgramm2, from_=0, to=128, font=deffont, width=3, command=apply)
- Programm2.place(x=100, y=30)
- Checkbutton(root, text='Split the keyboard', variable=fvsplitkeyboard, font=deffont, command=apply).place(x=10, y=52)
- Label(root, text='Split from:', font=deffont).place(x=10, y=70)
- Label(root, text='Transpose:', font=deffont).place(x=10, y=90)
- Spinbox(root, textvariable=fvSplitKeyBoardFromNum, from_=1, to=128, font=deffont, width=4, command=apply).place(x=80, y=70)
- Spinbox(root, textvariable=fvSplitKeyBoardTransponse1, from_=-127, to=128, font=deffont, width=4, command=apply).place(x=80, y=90)
- Spinbox(root, textvariable=fvSplitKeyBoardTransponse2, from_=-127, to=128, font=deffont, width=4, command=apply).place(x=130, y=90)
- #scrollbar = Scrollbar(root, orient='horizontal').place(200,100);
- value_var = IntVar(value=30)
- fvVelocityControl = BooleanVar(root)
- fvVelocityControl.set(False)
- Checkbutton(root, text='Replace velocity', variable=fvVelocityControl, font=deffont, command=apply).place(x=180, y=10)
- ttk.Progressbar(orient="vertical", variable=value_var, maximum=127).place(width=20,height=80,x=190,y=30)
- voutput = StringVar(root)
- vinput = StringVar(root)
- Label(root, text='Output:', font=deffont).place(x=10, y=120)
- Label(root, text='Input:', font=deffont).place(x=10, y=150)
- fvoutput = OptionMenu(root, voutput, *mido.get_output_names() )
- fvoutput.place(x=60, y=120)
- fvinput = OptionMenu(root, vinput, *mido.get_output_names() )
- fvinput.place(x=60, y=150)
- voutput.set(default_output)
- vinput.set(default_input)
- root.mainloop()
|