mAirList Scripting, MIDI sysex

Hallo,

ist es möglich über Scripts auch systemexklusive MIDI-Daten zu senden und evt. auch zu empfangen? Wenn ja, wie heißt die passende Funktion dazu? Mit MidiOut() ist das ja nicht möglich oder?

LG
ouzo

Und gleich noch eine Frage, scheinbar sendet MidiOut() am Ende immernoch auf allen Kanälen 64/0:

13:31:49.309 From MIDI Port Control 1 64 0
13:31:49.310 From MIDI Port Control 2 64 0
13:31:49.311 From MIDI Port Control 3 64 0
13:31:49.312 From MIDI Port Control 4 64 0
13:31:49.313 From MIDI Port Control 5 64 0
13:31:49.314 From MIDI Port Control 6 64 0
13:31:49.315 From MIDI Port Control 7 64 0
13:31:49.316 From MIDI Port Control 8 64 0
13:31:49.317 From MIDI Port Control 9 64 0
13:31:49.318 From MIDI Port Control 10 64 0
13:31:49.319 From MIDI Port Control 11 64 0
13:31:49.320 From MIDI Port Control 12 64 0
13:31:49.321 From MIDI Port Control 13 64 0
13:31:49.322 From MIDI Port Control 14 64 0
13:31:49.323 From MIDI Port Control 15 64 0
13:31:49.324 From MIDI Port Control 16 64 0

Weiß jemand warum?

SysEx-Nachrichten werden von mAirList derzeit nicht unterstützt. Es wäre aber kein großes Problem, das einzubauen. Zumindest für die Senderichtung. Bei der Empfangsrichtung sehe ich als größtes Problem die Frage, wie man das im Konfigurationsdialog pflegen sollte. Auf die Schnelle könnte ich nur eine Lösung anbieten, wo die SysEx-Nachrichten in einem Notification Script ankommen und dort ausgewertet und ggf. in Befehle umgesetzt werden.

Zur zweiten Frage: mAirList öffnet und schließt das Midi-Gerät automatisch vor bzw. nach jedem MidiOut-Befehl (WinAPI-Funktionen MidiOutOpen und MidiOutClose). Und zwar damit das Script das nicht selbst machen muss, und damit das MIDI-Gerät nicht versehentlich offen bleiben kann. Kann es sein, dass die 64/0-Nachrichten vom MidiOutClose generiert werden?

Danke für die Antwort!

Ob MidiOutClose dafür verantwortlich ist, weiß ich nicht. Ich würde es nur gerne deaktivieren, da mein Pult auch auf die Signale reagiert. Hab die Reaktionen des Pultes jetzt soweit deaktiviert im Pult selbst, ist aber keine schöne Lösung :wink:

Zu SysEx: Die Lösung für Notification Script würde mir vollkommen ausreichen, wäre super! (Wichtig wäre grade die Empfänger Seite, also z.B. “Wenn SysEx Daten XYZ ankommen, starte PFL”) Wie die SysEx Daten genau aussehen, weiß ich.

Torben: It looks like it’s sending a sustain controller off message to each MIDI channel. MidiOutReset does this:
http://winapi.freetechsecrets.com/mmedia/MMEDIAmidiOutReset.htm

Does MidiOutClose call MidiOutReset, or does mAirList call MidiOutReset?

(sorry to post in English!) :-[

BFN
CAD

mAirList does not call MidiOutReset. Only MidiOutClose. So the rest must take place implicitly then.

I think I will just add the manual MidiOutOpen and MidiOutClose calls to scripting, and the user will be obliged to call them before/after the actual MidiOut calls, or when the script is loaded/unloaded.

So, ich habe mich mal zunächst um die Senderichtung gekümmert. Ein neuer Build (911) liegt bereit. Das ist alles nicht getestet (habe im Moment kein MIDI-Equipment angeschlossen), daher wäre ich für Feedback sehr dankbar, ouzo.

Neuerungen:

  • Man muss das Gerät explizit mit MidiOutOpen(device) öffnen, bevor man etwas schicken kann.

  • Später bzw. am Ende des Scripts das Gerät dann wieder mit MidiOutClose(device) schließen.

  • Es gibt eine neue Funktion MidiOutSysEx(iDevice: integer; iData: string) zum Verschicken von SysEx-Nachrichten. Die Daten selbst werden als String erwartet; wenn man Hex-Daten (z.B. 0x12+0xAB) übergeben will, schreibt man das so:

MidiOutSysEx(1, #$12 + #$AB);

Bitte mal testen :slight_smile:

Vielen Dank schonmal für den Ultra-Support - Wahnsinn!

Ich werde es die nächsten Tage ausführlich testen und berichte.

So, im neuen Build 915 kann man nun auch Sysex-Nachrichten per Notification Script abfangen - jedenfalls theoretisch, ich konnte es nicht testen, weil mein einziges MIDI-Gerät (BCF2000) irgendwie keine Sysex-Nachrichten ausspuckt.

Folgende Prozedur musst du dem Script hinzufügen:

procedure OnMidiSysex(Device: integer; Data: string);
begin
end;

Wird ja immer interessanter!

Aber mal eine ganz einfache Frage: Wo bekomme ich die jeweiligen Builds?

http://www.mairlist.com/download/mAirList/v3.1/snapshot/ :wink:

BFN
CAD

Also hier mal meine ersten Erfahrungen:

MidiOutSysEx funktioniert super!

Bei der Prozedur zum Empfangen bekomme ich immer folgenden Fehler: “(1:23): Identifier expected”

Das bezieht sich auf folgende Zeile im Script:
procedure OnMidiSysex(0, #$F0 + #$43 + #$10 + #$3E + #$0D + #$03 + #$2E + #$00 + #$1E + #$00 + #$00 + #$00 + #$01 + #$F7);

(SysEx-Daten im “Original”: F0 43 10 3E 0D 03 2E 00 1E 00 00 00 01 F7)
Die gleichen Parameter nutze ich auch mit MidiOutSysEx und da funktioniert es.

Viele Grüße

Ich würde mal sagen, du benutzt die Prozedur etwas falsch.

Dein Script muss mehr oder weniger so aussehen:

procedure OnMidiSysex(Device: integer; Data: string);
begin
  // hier!
end;

begin
end.

Das speicherst du dann z.B. als “sysex.mls” und registrierst es wie im Handbuch beschrieben als Benachrichtigungs-Script, damit mAirList es beim Programmstart lädt.

An der mit “// hier!” markieren Stelle musst du jetzt Code eingeben, der die empfangenen Daten - in der Variable “Data” enthalten - mit irgendwelchen Sachen vergleicht und dann etwas tut, zum Beispiel einen Befehl ausführen:

procedure OnMidiSysex(Device: integer; Data: string);
begin
  if Data = #$F0 + #$43 + #$10 + #$3E + #$0D + #$03 + #$2E + #$00 + #$1E + #$00 + #$00 + #$00 + #$01 + #$F7 then
    ExecuteCommand('PLAYER 1-1 START');
end;

begin
end.

Wie genau der Vergleichsstring auszusehen hat, was also dein MIDI-Gerät schickt, auf das du dann reagieren möchtest, das musst du schon selbst wissen :slight_smile:

Natürlich kann man auch mehrere Vergleiche + ExecuteCommand-Befehle dort einsetzen.

Ok, war ein generelles Verständnisproblem, aber nun hab ich es verstanden. :slight_smile:

Also mein MIDI-Gerät sendet folgendes: (an)

F0 43 10 3E 0D 03 2E 00 1E 00 00 00 01 F7

und (aus)

F0 43 10 3E 0D 03 2E 00 1E 00 00 00 00 F7

Habe es im Script so umgesetzt:

[code]procedure OnMidiSysex(Device: integer; Data: string);
begin

if Data = #$F0 + #$43 + #$10 + #$3E + #$0D + #$03 + #$2E + #$00 + #$1E + #$00 + #$00 + #$00 + #$01 + #$F7 then
ExecuteCommand(‘PLAYLIST 1 EXTRAPFL ON’);
if Data = #$F0 + #$43 + #$10 + #$3E + #$0D + #$03 + #$2E + #$00 + #$1E + #$00 + #$00 + #$00 + #$00 + #$F7 then
ExecuteCommand(‘PLAYLIST 1 EXTRAPFL OFF’);

end;[/code]

Es passiert aber nichts.

Es kommen keine Fehler und umgekehrt funktioniert es auch bestens. Kann es sein, dass mAirList irgendwie andere Daten erwartet?

mAirList “erwartet” gar keine Daten, das ist ja der Trick. Die Auswertung muss komplett dein Script übernehmen, bei dem die Rohdaten unverändert ankommen.

Teste bitte zunächst mal, ob überhaupt Sysex-Daten durchkommen:

procedure OnMidiSysex(Device: integer; Data: string);
begin
  SystemLog('SysEx: ' + Data);
end;

begin
end.

Das Script sollte bei jeder Sysex-Nachricht einen Eintrag unten im Systemprotokoll (Statuszeile im Hauptfenster) erzeugen, mit den Daten als kryptische Sonderzeichen dahinter.

Jep, kommt was, allerdings immer das gleiche - egal wo ich beim MIDI-Gerät raufdrücke…


status.JPG

Vielleicht sieht es nur gleich aus, weil im Systemprotokoll bestimmte Sonderzeichen nicht dargestellt werden können. Hier ist nochmal eine Variante, die die Daten als Hex im Protokoll ausgeben:

procedure OnMidiSysex(Device: integer; Data: string);
var
  i: integer;
  s: string;
begin
  s := '';
  for i := 1 to length(Data) do
    s := s + IntToHex(ord(Data[i]), 2) + ' ';
  SystemLog('SysEx: ' + s);
end;

begin
end.

Übrigens, wenn du was aus dem Systemprotokoll hier posten möchtest, musst du keinen Screenshot machen - du kannst einen Doppelklick auf die Statuszeile machen und im Systemprotokoll-Fenster die Einträge markieren und in die Zwischenablage kopieren.

IntToHex and Ord don’t work in mAirListScript, BTW. :smiley:

BFN
CAD

They do. I tested the script before I posted it. Just because I wasn’t sure if the functions existed. But they do. (Ord is supplied by Pascal Script by default, and IntToHex was added by me a while ago.)

I sit corrected! Unless ‘a while ago’ means ‘when I found it didn’t work’? :smiley: Just kidding …

I think it may have been because my nearly identical version of your code was trying to use Copy instead of an index. :-[ (I never claimed to be a Pascal expert!)

BFN
CAD