Seite 3 von 3

Verfasst: 16.01.2007 21:00
von NicTheQuick
Falls jemand mal wieder etwas herumklimpern will, hier wieder ein
Progrämmchen und das passende Tastaturlayout:

http://freakshow.gpfclan.de/PureBasic/P ... zzOn_2.exe
Bild
('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

Verfasst: 16.01.2007 23:53
von Rubiko
Kleiner Fehler: Drücke ich q + w (z.B) halte es gedrückt und wechsel auf ein andres Fenster, lass die beiden Tasten los dann bleiben sie rot eingefärbt, auch wenn ich wieder aus Klavierfenster zurückwechsel...

Verfasst: 17.01.2007 12:08
von NicTheQuick
Das ist logisch, weil du dem Mausklavier dann die #WM_KeyUp-Message
vorenthältst. Und es erkennt auch nicht, ob das Fenster den Focus verliert.
Vielleicht sollte ich das noch einbauen.

Verfasst: 07.03.2007 22:40
von stbi
NtQ, danke für Dein Programm, ist ein prima Testprogramm für Midi-Devices. Ich konnte jetzt damit rausfinden, dass mein stationärer PC eine Macke bzgl. Midi hat, er verschluckt nämlich Anschläge des USB-Keyboards. Hier auf dem Laptop könnte ich sogar 64stel spielen, wenn ich denn könnte ... <)

Verfasst: 07.03.2007 23:11
von Kaeru Gaman
@Nic

ich wäre dran interessiert, auf MIDI-basis ne soundeffekt-ausgabe zu realisieren.
also, ein kleines include, womit man playsound-maßig effektsounds wie explosionen,
motorengeräusch, etc. abspielen kann, ohne WAVs oder OGGs laden zu müssen.

das ganze soll dazu dienen, minigames als reine listings, ohne resourcen erstellen zu können.
mit grafix komm ich ja klar, für den sound über MIDI bräucht ich ein paar anstöße...

Verfasst: 10.04.2007 08:51
von Blechi
Hallo,

zuerst mal ein Lob an NicTheQuick (hallo Landsmann) für die Programmierung des MIDI-Interfaces, tolle Arbeit.
Den MIDI Output habe ich (sogar als PB-Neuling) soweit im Griff.
Womit ich jedoch Verständnisprobleme habe ist die Sache mit dem MIDI-Input. Hier macht mir die Funktion

Code: Alles auswählen

OpenInputDevice.l(DeviceID.l, Callback.l, UserData.l)
zu schaffen. Ich verstehe die Parameter Callback.l und UserData.l nicht. Wie ist das Vorgehen, um an die Daten heranzukommen, welche via MIDI Schnittstelle (von einem Masterkeyboard/Sequenzer) angeliefert werden? Das JOEKeys-Beispiel hilft mir hier leider nicht weiter. Vielleicht sollte ich noch erwähnen, dass ich programmiertechnisch aus der Microcontroller-Assembler-Ecke komme, wo die in dieser und anderen Hochsprachen verwendeten abgefahrenen Zeiger- und Datenkonstrukte eher unüblich sind.
Wäre es möglich ein einfaches Beispiel für die Initialisierung der MIDI-In-Abteilung und die Übergabe der Daten zur Weiterverarbeitung zu bekommen?

Vielen Dank schonmal
mfG
Blechi

Verfasst: 12.04.2007 20:05
von PureLust
Hi Nick, ... sorry wenn ich mich mal wieder zu blöde anstelle, aber wo bekomme ich die von Dir verwendeten Includes her?
XIncludeFile "JO_Keys.pbi"
XIncludeFile "JO_Convert.pbi"

Verfasst: 03.09.2007 10:39
von NicTheQuick
Nanu, lange nicht geantwortet. :?

@PureLust:
Die Includes sind extra nicht dabei, weil das ganze ein CloseSource-Projekt
ist. Kann sich allerdings auch wieder ändern.

@all:
Ich habe die Links wieder angepasst. Sie hatte ein Verzeichnis verschoben.