Seite 2 von 2

Re: Midi Abfrage ....

Verfasst: 18.12.2020 19:21
von NicTheQuick
Ich habe leider keine Zeit mir diese Tabelle genauer anzuschauen. Außerdem habe ich das Gerät nicht und schon seit mindestens 12 Jahren auch kein Windows mehr. Sprich ich kann meinen eigenen Code jetzt eh nicht mehr testen.

Re: Midi Abfrage ....

Verfasst: 25.12.2020 14:41
von Mauli
:lol: Haha, habe nun auch so ein DDJ-200 zu Weihnachten bekommen, weil ich mal sowas erwähnte. Nun habe ich das Teil hier stehen und will es auch am liebsten zum "leuchten" bringen.

Die Abfrage funktionierte auch super, aber senden kann ich auch nichts an das Gerät. Ich würde gerne meinen MP3 Player damit steuern und auch eine Rückmeldung an die Tasten schicken.

2x ist mit der PC damit abgeschmiert. Im englischen Forum habe ich nun auch diese Diskussion verfolgt und ich finde, es sollte wieder aufgenommen werden. Die Controller sind doch feine Gadgets.

Code: Alles auswählen

EnableExplicit

Macro MIDIKeyMessage(Status, Channel, key, Velocity)
  ((Velocity << 16) | (key << 8) | (Status << 4) | (Channel - 1))
EndMacro

Macro MIDIInstrumentMessage(Channel, Instrument)
  (((Instrument - 1) << 8) | (%1100 << 4) | (Channel - 1))
EndMacro

Define iNumDev.i, around.i, moc.MIDIOUTCAPS, Instrument.i, Result.i, hmo.i,t,k,v

iNumDev = midiOutGetNumDevs_()
For around = 0 To iNumDev - 1
  midiOutGetDevCaps_(around, moc, SizeOf(MIDIOUTCAPS))
  Debug " " + Str(around) + " " + PeekS(@moc\szPname[0], #MAXPNAMELEN)
Next

Result = midiOutOpen_(@hmo,1, #Null, #Null, #CALLBACK_NULL)

If Result = #MMSYSERR_NOERROR
     midiOutShortMsg_(hmo, MIDIInstrumentMessage(10, 1))
      Delay(500)
     midiOutShortMsg_(hmo, MIDIKeyMessage(%1001,10, 4, 0))
      Delay(500)
   Result = midiOutClose_(hmo)
Else
  Debug "midiOutOpen Error: " + Str(Result)
EndIf
auch damit habe ich mal rumgespielt, aber kam nicht bei raus. Auch die MIDI_IN müsste da noch rein, um wenigstens abzufragen. Midi ist schon eine interessante Sache.

Re: Midi Abfrage ....

Verfasst: 25.12.2020 15:24
von NicTheQuick
Im zweiten Post hier ist ein Thread von mir verlinkt mit eine guten Vorlage zum Arbeiten mit MIDI. Wenn du MIDI-Out verwenden möchtest, musst du aber die shared Variable setzen.

Wieso ist dein PC eigentlich abgeschmiert? :?

Re: Midi Abfrage ....

Verfasst: 25.12.2020 16:57
von Mauli
Warum Windows abschmierte weis ich nicht. Aber es passierte immer, wenn ich das Midi Programm getestet hatte. Bisher 3x. Bin jetzt auch kein Profi in Pb, daher weiß ich nicht genau was du meinst.

Re: Midi Abfrage ....

Verfasst: 25.12.2020 22:54
von Larissa22
Hey, ich bin komplett neu hier und habe bisher nur gelesen. Ich bin DJ und programmiere mit PB auch so einige Spielereien wie Soundboards, Effektboards oder andere coole Toolz für meine GIGs. Ist eben mit PB echt easy :allright:

Nun bin ich auch auf diese MIDI Geschichte aufgesprungen, denn ich habe ein Launchpad, welches ich gerne selbst ansteuern würde. Ich benutze dieses hier :

https://www.gear4music.de/de/Keyboards- ... i-MK3/34U1

Ein klasse Teil, aber es würde mir mehr helfen, wenn ich´s besser integrieren könnte. Nicht überall brauche ich diese mitgelieferte Software, sondern es passte perfekt zu meinen kleinen Helferleins. Ich kann die Tasten mit dem geposteten Code oben zwar abfragen, aber wie krieg ich die Pads zum leuchten ? Wäre cool, wenn da jemand ´ner Anfängerin helfen könnte <)

Auch der Code zum Abfragen kommt mir sehr überladen vor, braucht man das alles ??

Re: Midi Abfrage ....

Verfasst: 26.12.2020 18:21
von Then
Habe mal den Code deutlich verkleinert (Man möge mir die Fehler verzeihen, aber auch gerne zeigen)

Code: Alles auswählen

#MIDIRequ_InSet = 2 
#MIDIRequ_OutSet = 1 
OutDevice.l=1
InDevice.l=0
MIDIResult=3
InfoOut.MIDIOUTCAPS  

Structure MIDIData 
  Channel.b 
  Note.b 
  Velocity.b 
  Null.b 
EndStructure 

Procedure MidiInProc(hMidiIn.l, wMsg.l, dwInstance.l, dwParam1.l, dwParam2.l) 
 Protected Status.l, OnOf.l, NoteNr.l, Velocity.l 
  Select wMsg 
   Case #MM_MIM_DATA 
    Status=dwParam1 & $FF
    key1=(dwParam1 >>  8) & $FF  
    key2=(dwParam1 >> 16) & $FF 
    key3=dwParam1 & $F          
    key4=dwParam2
    SetGadgetText(11,Str(Status))
    SetGadgetText(12,Str(key1))
    SetGadgetText(13,Str(key2))
    SetGadgetText(14,Str(key3))
    SetGadgetText(15,Str(key4))
   EndSelect 
EndProcedure 

If MIDIResult & #MIDIRequ_InSet 
  hMidiIn.l 
  If midiInOpen_(@hMidiIn, InDevice, @MidiInProc(), 0, #CALLBACK_FUNCTION) = #MMSYSERR_NOERROR 
    If midiInStart_(hMidiIn) = #MMSYSERR_NOERROR  
    EndIf 
  EndIf 
EndIf 

If hMidiIn And hMidiOut 
  If midiConnect_(hMidiIn, hMidiOut, 0) = 0 
  EndIf 
EndIf 

main:
OpenWindow(0,0,0,260,90,"",#PB_Window_ScreenCentered)
TextGadget(1, 10,10,40,20,"Status")
TextGadget(2, 60,10,40,20,"Key1")
TextGadget(3,110,10,40,20,"Key2")
TextGadget(4,160,10,40,20,"Key3")
TextGadget(5,210,10,40,20,"Key4")
ButtonGadget(7,10,60,80,20,"EXIT")
StringGadget(11, 10,30,40,20,"",#PB_Text_Right)
StringGadget(12, 60,30,40,20,"",#PB_Text_Right)
StringGadget(13,110,30,40,20,"",#PB_Text_Right)
StringGadget(14,160,30,40,20,"",#PB_Text_Right)
StringGadget(15,210,30,40,20,"",#PB_Text_Right)

Repeat
 Delay(1)

 Event=WindowEvent()
 Select Event 
  Case #PB_Event_Gadget 
   Gadget=EventGadget()
   Select Gadget
    Case 7
     midiDisconnect_(hMidiIn, hMidiOut, 0) 
     While midiInClose_(hMidiIn) = #MIDIERR_STILLPLAYING : Wend 
     While midiOutClose_(hMidiOut) = #MIDIERR_STILLPLAYING : Wend 
    End
    
   EndSelect
 EndSelect
ForEver  
Damit kannste den Datenfluss der MIDI Schnittstelle anzeigen. Wie man jedoch wieder einen genauen Wert (0-127) vom Drehregler bekommt, kriege ich nicht hin, sorry. Vielleicht schafft es ein anderer....

Re: Midi Abfrage ....

Verfasst: 30.12.2020 18:07
von Larissa22
Hi, danke, habe nun Zeit gefunden diesen wirklich kurzen Code zu testen. Funktioniert super :allright: , aber wie kann ich nun den genauen Wert der Regler oder Jogwheels finden. Dieser sollte laut Beschreibung (und anderen Codes) von 0-127 gehen.

Wichtiger wäre mir eben, wie man nun per MIDI sendet. Ist scheinbar doch nicht so einfach :?

Re: Midi Abfrage ....

Verfasst: 19.01.2021 18:33
von Stuhli
Also, wenn ich an meinen Wheels drehe, wird der Wert, der ausgegeben wird immer größer, egal in welche Richtung ich drehe. Jetzt muss quasi nur der Unterschied zwischen Ausgangswert und Endwert ausgerechnet werden und anhand der Drehbewegung kann man diesen dann von einer vorgegebenen Variable subtrahieren oder addieren.

Wie das genau geht... :| keine Ahnung. Vielleicht erbarmt sich ja doch mal einer der "Profis" und hilft uns. Da ja nun doch mehrere Leute genau dieses Thema derzeit verstehen wollen.