Progrämmchen und das passende Tastaturlayout:
http://freakshow.gpfclan.de/PureBasic/P ... zzOn_2.exe

('I' ist auch noch ein C)
Wenn das Programm gestartet hat, In und Out auswählen, dann per
Layout herumklimpern, durch F1 bis F3 werden Presets für das
Einstellungen-Fenster vorgenommen. Damit lassen sich Töne anderen
Tönen zuordnen.
Das Programm muss per ESC beendet werden. Das Schließen beider
Fenster bringt nichts, weil sie nur versteckt werden. Mit F11 und F12
werden sie wieder sichtbar.
Hier der Code vom Hauptprogramm. Mehr gibt es nicht.

Code: Alles auswählen
XIncludeFile "JO_Keys.pbi"
XIncludeFile "JO_Convert.pbi"
;B E I S P I E L F Ü R D A S I N T E R F A C E
Global *MIDI.PB_MIDI, *Convert.JOConvert, *Keys1.JOKeys
Procedure KeyCallback(*Keys.JOKeys, Note.b, Velocity.b, UserData.l)
Note = *Convert\Convert(Note)
If Velocity > 0
*MIDI\NoteOn(0, Note, Velocity)
*Keys\NoteOn(Note, Velocity)
Else
*MIDI\NoteOff(0, Note)
*Keys\NoteOff(Note)
EndIf
Debug Str(Note) + ": " + Str(Velocity)
EndProcedure
Procedure MidCallback(*PM.PB_MIDI, *msg.PB_MIDI_MsgEx, *Keys.JOKeys)
Select *msg\DataTyp
Case #PB_MIDI_NoteOn
*msg\Note = *Convert\Convert(*msg\Note)
*Keys\NoteOn(*msg\Note, *msg\Velocity)
Case #PB_MIDI_NoteOff
*msg\Note = *Convert\Convert(*msg\Note)
*Keys\NoteOn(*msg\Note, *msg\Velocity)
Case #PB_MIDI_ProgramChange
Debug "C" + Str(*msg\Channel) + ", P" + Str(*msg\Voice)
EndSelect
*PM\Out(*msg)
EndProcedure
; C O N V E R T
*Convert.JOConvert = JOConvert_New()
; M I D I
Define OutDevice.l, InDevice.l, SelDevices.l
*MIDI.PB_MIDI = PB_MIDI_Create()
SelDevices = *MIDI\Requester(@OutDevice, @InDevice)
If SelDevices = 0 : End : EndIf
*Convert\Settings()
; K E Y B O A R D
*Keys1.JOKeys = JOKeys_New("Mausklavier 1")
*Keys1\Callback(@KeyCallback(), 0)
*Keys1\Resize(0, 200, 600, 40)
*Keys1\Hide(#False)
*Keys1\SetKeyboard(?Tasten)
*Keys1\AutoAspectRatio(#True)
*Keys1\SyncInput(#False)
*Keys1\KeyNote(48)
; M I D I
If SelDevices & #PM_Requester_InSet
*MIDI\OpenInputDevice(InDevice, @MidCallback(), *Keys1)
*MIDI\StartInput()
EndIf
If SelDevices & #PM_Requester_OutSet
*MIDI\OpenOutputDevice(OutDevice)
*MIDI\ProgramChange(0, 0)
EndIf
Repeat
*Convert\Event(WaitWindowEvent(100))
If GetAsyncKeyState_(#VK_F1) ;Eb, Ab, Bb
*Convert\Reset()
*Convert\Offset(4, -1)
*Convert\Offset(9, -1)
*Convert\Offset(11, -1)
*Convert\Expand()
*Convert\Update()
EndIf
If GetAsyncKeyState_(#VK_F2) ;F#
*Convert\Reset()
*Convert\Offset(5, 1)
*Convert\Expand()
*Convert\Update()
EndIf
If GetAsyncKeyState_(#VK_F3) ;C#, D#, E#, F#, G#, A#
*Convert\Reset()
*Convert\Offset(0, 1)
*Convert\Offset(2, 1)
*Convert\Offset(4, 1)
*Convert\Offset(5, 1)
*Convert\Offset(7, 1)
*Convert\Offset(9, 1)
*Convert\Expand()
*Convert\Update()
EndIf
If GetAsyncKeyState_(#VK_F11) ;Mausklavier wieder erscheinen lassen
*Keys1\Hide(#False)
EndIf
If GetAsyncKeyState_(#VK_F12)
*Convert\Hide(#False)
EndIf
Until GetAsyncKeyState_(#VK_ESCAPE)
*Keys1\Kill()
*Convert\Kill()
*MIDI\Kill()
DataSection
Tasten:
Data.l 25 ;Anzahl aufeinander folgender Noten
Data.l #VK_Y, #VK_S, #VK_X, #VK_D, #VK_C, #VK_V, #VK_G, #VK_B, #VK_H, #VK_N, #VK_J, #VK_M
Data.l #VK_Q, #VK_2, #VK_W, #VK_3, #VK_E, #VK_R, #VK_5, #VK_T, #VK_6, #VK_Z, #VK_7, #VK_U, #VK_I
Data.l -1, -1 ;eins höher/tiefer (-1 = ignorieren)
Data.l #VK_UP, #VK_DOWN ;eine oktave höher/tiefer
EndDataSection