Interface zur Ansprechung der MIDI-Schnittstelle

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Zuletzt geändert von NicTheQuick am 03.09.2007 10:34, insgesamt 1-mal geändert.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag 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...
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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 ... <)
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Blechi
Beiträge: 1
Registriert: 10.04.2007 08:09
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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"
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Antworten