Brauche Hilfe bei ein paar Script Befehlen

Liebe Tondose,

herzlichen Dank für die megaschnelle Antwort!!!
Das ist genau was ich gesucht habe - Danke!

Leider steht dort kein Befehl zum Aufrufen von ExtraPFL. Hast du eine Idee wie ich das mache?

Danke und liebe Grüße

Robert

Meintest Du den Abschnitt hier?
https://wiki.mairlist.com/reference:remote_control_commands#extra_pfl

Ja - da ist leider kein “OPEN” dabei. Wie schalte ich ExtraPFL also ein?

Dann probier mal PLAYLIST 1 EXTRAPFL ON. Steht da unter Playlist.

Ergänzte Grüße

TSD


Ich hab’s im Wiki nachgetragen.

1 Like

Hi Tondose und UliNobbe,

danke für eure Hilfe.

Das meiste funktioniert jetzt. Aber ein Script bekomme ich nicht ans laufen. Ich bin leider auch nicht so bewandert in Pascal. Ich möchte, dass das Script abgleicht ob Mairlist oder mein Pult (X32) auf PFL geschaltet sind. Wenn ich also an Mairlist PFL drücke, soll das Pult auch auf PFL gehen (Mute Group am X32) und wenn ich am Pult PFL drücke soll Mairlist auf PFL gehen. Ich habe das Script hier geschrieben, aber leider passiert garnichts:

var
x32pfl : boolean;
pflon : boolean;

//check if X32 is on PFL

procedure OnMidiMessage(Device: integer; Status, Data1, Data2: byte);
begin
if (Status=$B1) and (Data1 = $50) and (Data2= $00) then
x32pfl := true;
if (Status=$B1) and (Data1 = $50) and (Data2= $7F) then
x32pfl := false;
end;


// check if mairlist is on pfl

procedure OnPFLOn(Item: IPlaylistItem; PFLCount: integer);
begin
if (PFLCount = 1) then
pflon := true
end;

procedure OnPFLOff(Item: IPlaylistItem; PFLCount: integer);
begin
if (PFLCount = 1) then
pflon := false
end;


//compare and switch on X32 or mairlist

begin
if pflon and (x32pfl = false) then
MidiOut(1, $B1, $50, $00);

if (pflon = false) and x32pfl then
ExecuteCommand('PLAYLIST 1 EXTRAPFL ON');

if x32pfl and (pflon = false) then
ExecuteCommand('PLAYLIST 1 EXTRAPFL OFF');

if (x32pfl = false) and pflon then
MidiOut(1, $B1, $50, $7F);

end.

Habt ihr eine Idee woran es liegen könnte?

Danke schon mal!

Robert


EDIT by Mod - Formatierung.
Code bitte auch als solchen formatieren; das erhöht die Lesbarkeit ungemein. Zu diesem Zweck gibt es im Edit-Fenster das Symbol </>. Vielen Dank!

Hallo Robert,
ein Projekt mit einem x32, da muss ich natürlich auch einsteigen. Das Pult interessiert mich und einige Hintergründe, was Du da, wie machen möchtest würden mich ggf. später auch noch interessieren.

Für eine komplettere Lösung wird wahrscheinlich @Tondose noch mal mit einsteigen müssen, ein paar Punkte sind mir dann doch aufgefallen, die noch konzeptionelle Fragen aufwerfen.

Es gibt in mAirlist eine Unterscheidung zwischen PFL und ExtraPFL, das ist historisch gewachsen. PFL Meint das klassische vorhören, einer Quelle auf einem Mixer. Also z.B. einen Deiner Hauptplayer, so wie man es auch bei einem DJ set macht.
Du nutzt hier aber den Befehl für den ExtraPFL, dementsprechend, müsstest Du natürlich auch das Procedure “OnExtraPFLOn” bzw. off benutzen.
Zitat aus dem Background Script Template.mls

// Called when cue editor, mix editor... (but not a player) starts playback
// ExtPFLCount is the number of active such ExtPFL sources

Dementsprechend ein Vergleich des ExtraPFLCount >= 1 oder <= 1

Gut, fangen wir mal an durch zu arbeiten. Unglaubaublich, ich gebe Hineweise zur Script Syntax, man notiere das bitte im Kalender. Ich schweife ab… :wink:

Die Variablen Deklaration, kannst Du zusammenfassen:

var
x32pfl, pflon : boolean;

Bei den Midi Nachrichten, weiß ich nicht, ob es so sinnvoll ist, die hier direkt fix zu verdrahten. Wenn dann vermutlich eher so:

//check if X32 is on PFL

procedure OnMidiMessage(Device: integer; Status, Data1, Data2: byte);
begin
   if (Status=$B1) and (Data1 = $50) and (Data2= $00) then
      x32pfl := true;
      end
   else if (Status=$B1) and (Data1 = $50) and (Data2= $7F) then
      x32pfl := false;
   end;
end;

Ich denke da würde ich eher nach diesem Tutorial einen eigenen Befehl stricken. Diesen eigenen Befehl, kannst Du dann in der Fernsteuerung beliebig neu vergeben. Musst also nicht jedes mal ins Script rein, wenn Du hier am Pult noch mal etwas umkonfigurieren möchtes.

procedure OnExecuteCommand(Command: string);
begin
  if Command = 'X32 PFL ON' then
    x32pfl := true;
  end
  else if Command = 'X32 PFL OFF' then
      x32pfl := false;
  end;
end;

Ausserdem möchte ich ja, in dem Moment wo dieser Befehl kommt, immer ein PFL Fenster öffnen, egal was sonst gerade war und wenn eins offen ist, möchte ich beim ausschalten, dass das auch immer zu geht.

procedure OnExecuteCommand(Command: string);
begin
  if Command = 'X32 PFL ON' then begin
      ExecuteCommand('PLAYLIST 1 EXTRAPFL ON');
      x32pfl := true;
  end
  else if Command = 'X32 PFL OFF' then begin
      x32pfl := false;
      ExecuteCommand('PLAYLIST 1 EXTRAPFL OFF');
  end;
end;

Jetzt müssen wir nur noch die andere Richtung beackern, in mAirlist wird Extra PFL an oder aus geschaltet und das Pult soll folgen.
Etwa so:

// check if mairlist is on pfl

procedure OnExtraPFLOn(Item: IPlaylistItem; PFLCount: integer);
   begin
      if (ExtPFLCount >= 1) then begin
         if not x32pfl then
           MidiOut(1, $B1, $50, $00);
         end;	
      end
   end;   

procedure  OnExtPFLOff(Item: IPlaylistItem; PFLCount: integer);
begin
   if (ExtPFLCount <= 1) then begin
      if x32pfl then
         MidiOut(1, $B1, $50, $7F);
     end;	
   end 
end;

Wir brauchen also gar keinen weiteren Zwischenstatus um den mAirlist ExtraPFL und den Pult Status zu vergleichen. Wir müssen nur wissen, was das Pult macht. Die Variable pflon können wir als vernichten.

Komplett sieht das dann ungefähr so aus: (Bestimmt noch Syntax Fehler drin)

var
x32pfl : boolean;

// on Script load or on mairlist Startup, sync Status and switch it all off.

procedure OnLoad;
  begin
    x32pfl := false;
	MidiOut(1, $B1, $50, $7F);
  end;


//respond to X32 incoming command

procedure OnExecuteCommand(Command: string);
begin
  if Command = 'X32 PFL ON' then begin
      x32pfl := true;
      ExecuteCommand('PLAYLIST 1 EXTRAPFL ON');
  end
  else if Command = 'X32 PFL OFF' then
      x32pfl := false;
     ExecuteCommand('PLAYLIST 1 EXTRAPFL OFF');
  end;
end;


// check if mairlist is on pfl

procedure OnExtraPFLOn(Item: IPlaylistItem; PFLCount: integer);
   begin
      if (ExtPFLCount >= 1) then begin
         if not x32pfl then
           MidiOut(1, $B1, $50, $00);
	     end;	
      end
   end;   

procedure  OnExtPFLOff(Item: IPlaylistItem; PFLCount: integer);
begin
   if (ExtPFLCount <= 1) then begin
      if x32pfl then
         MidiOut(1, $B1, $50, $7F);
      end;	
   end 
end;

begin
end.

Ungetestet, nur am Schreibtisch entstanden unter Einfluss von viel zu wenig Kaffee.

Lieber shorty xs,

ganz großen Dank für deine sehr ausführliche Antwort, der ich in weiten Teilen nur zustimmen kann.

Ich bin nicht wirklich fit in Pascal, deshalb auch das etwas umständliche Script.

Ja du hast recht, mit einem Befehl aus Mairlist ist das sicherlich schöner, jedoch muss ich sowieso wieder bei Änderungen ins Script rein, da am Schluss die umgekehrte Synchronisation mit dem Pult ja wieder hart verdrahtet ist. Insofern macht es glaube ich keinen Unterschied.

Waren in der Tat ein paar kleine Syntaxfehler drin - die waren aber schnell behoben und ich hab es ausprobiert. Leider passiert genau das, was ich geahnt habe. Du baust dir mit deinem Script eine Schleife, die Mairlist in einen Befehlsloop verfallen lässt und deshalb unresponsive macht.

Wenn du umgekehrt prüfst, ob PFL in Mairlist an ist und dann das Midi Kommando für die Taste an das Pult schickst, bewirkst du bei Mairlist ja den Befehl, dass PFL eingeschaltet werden soll (bzw. den Schalter X32 PFL ON zu setzen) usw. Es ist also zwangsläufig eine ausgedehnte Abfrage nötig um sowas zu vermeiden.

Aber dein Hinweis auf ExtraPFL war sehr gut. Ich versuche es nochmal damit.

Und dein kleiner Codeschnipsel am Anfang zur Initialisierung ist natürlich perfekt! Hab ich gar nicht dran gedacht.

Ich probiere nochmal was rum und poste hier mein Ergebnis.

Vielen Dank nochmal!!!

Robert

@shorty.xs: Augenblick! Die Prozedur OnExtraPFL(…); gibt es nicht. Hierzu ein Wort vom Boss:

Es hängt also von Deiner, Robert, weiteren Verwendung ab, ob Du OnPFLOn oder OnExtPFLOn verwendest. Für mein perönliches Setup nutze ich überhaupt nie die PFL-Funktion der Player, sondern höre mit ExtraPFL immer nur die Playlistelemente vor. (Cartwall ist was anderes.) Dann (bei mir also) ist es aber auch egal, ob Du mit oder ohne Ext benutzt. (Für das untige Skript habe ich das „normale“ genommen – weitere Gedanken folgen.)

Etwas ganz grundsätzliches @derrotedj:

Du kannst Dein Skript auf Syntaxfehler prüfen, indem Du es unter mAirList > Script ausführen… hochlädst. Kommt kein Mecker, sieht es in dieser Hinsicht gut aus. (Was aber nicht heißt, daß das Skript auch funktionieren wird.)

Zu @shorty.xs’ Skript:

Ein bißchen mit begins und ends aufgeräumt und wichtig: Bei der Abfrage nach PFLCount (der Zahl der geöffneten PFLs: Ist PFLCount = 0, dann sind alle geschlossen, PFL also sicher aus) hast Du einmal >= 1 und dann <= 1 eingesetzt. Das geht nicht, denn wenn PFLCount = 1, ist der Zustand nicht eindeutig definiert, es könnte beides zutreffen. Also entweder < 1 oder gleich = 0.

Ansonsten hätte ich es ähnlich gemacht und schlage @shorty.xs’ Skript, dahingehend korrigiert und etwas formschöner, noch einmal vor:

var
  x32pfl : boolean;

// On Script load or on mairlist startup, sync status, set variables to false and switch PFL off.

procedure OnLoad;
begin
  x32pfl := false;
  MidiOut(1, $B1, $50, $7F);
end;

// On Script unload or on mairlist shutdown, switch PFL off.

procedure OnUnload;
begin
  MidiOut(1, $B1, $50, $7F);
end;

//respond to X32 incoming command

procedure OnExecuteCommand(Command: string);
begin
  if Command = 'X32 PFL ON' then begin
    x32pfl := true;
    ExecuteCommand('PLAYLIST 1 EXTRAPFL ON');
  end
  else if Command = 'X32 PFL OFF' then begin
    x32pfl := false;
    ExecuteCommand('PLAYLIST 1 EXTRAPFL OFF');
  end;
end;


// check if mairlist is on pfl

procedure OnPFLOn(Item: IPlaylistItem; PFLCount: integer);
begin
  if (PFLCount >= 1) AND NOT x32pfl then
    MidiOut(1, $B1, $50, $00);
end;   

procedure OnPFLOff(Item: IPlaylistItem; PFLCount: integer);
begin
  if (PFLCount = 0) AND x32pfl then
    MidiOut(1, $B1, $50, $7F);
end;

begin
end.

Ich habe noch ein Ausschalten ergänzt, daß, wenn mAirList heruntergefahren wird, PFL am Pult mit ausgeschaltet wird.

@derrotedj: Du mußt vorher noch in der Konfiguration/Systemsteuerung unter Fernsteuerung > Hinzufügen > MIDI definieren, daß beim drücken von PFL am Pult der Befehl X32 PFL ON ausgeführt wird (einfach händisch reinschreiben) und umgekehrt mit … OFF.

Ich mache mal hier eine Zäsur und poste, dann kommt noch ein Gedanke von mir.

Kliffhängende Grüße

TSD


Edit: Ich habe noch die verschachtelte if-Anweisung zusammengefaßt.

@shorty.xs: Wozu die Variable x32pfl? Das hat Du doch mit PFLCount schon abgefrühstückt?! (Jetzt nicht gleich ein neues Skript posten, ich arbeite dran, kann aber noch was dauern.)

Das war noch nicht der Gedanke, aber man denkt sich so vom Stöckchen aufs Hölzchen.

Nachgefragte Grüße

TSD

Liebe Tondose,

vielen Dank für deinen ganzen Aufwand!

ich hab natürlich schon alles gemacht was du schreibst (Midi Befehl, Syntax Check mit Mairlist usw.), ist ja nicht das einzige Script das läuft :wink:

Das Script läuft leider nur in eine Richtung (am Pult PFL on bewirkt ExtraPFL in Mairlist). Aber leider nicht andersrum (PFL in Mairlist bewirkt Pult PFL).

Es wird einfach kein Midi befehl gesendet. Das war genau das gleiche Problem dass ich mit meinem Script am Anfang hatte.

Wenn ich im OnLoad Bereich den Midibefehl sende wird er korrekt ausgelöst.

Hmm - das ist genau das, was ich nicht verstehe.

Liebe Grüße

Robert

Ich habe ja das Problem, dass sonst ein zweites PFL Fenster geöffnet wird, weil ich ja die beiden Zustände (Mairlist PFL und Pult PFL) getrennt betrachten muss.

Wenn ich also an Mairlist auf PFL schalte möchte ich, dass am Pult auch PFL geschaltet wird aber dann eben NICHT ein zweites mal ExtraPFL ausgeführt wird.

Deshalb brauche ich meiner Meinung nach auch eine zusätzliche Variable, die den PFL Zustand von Mairlist speichert, damit ich vergleichen kann. Aber vielleicht denke ich einfach zu umständlich und ihr Codingcracks überblickt das besser :wink:

Ist kompliziert - ich hoffe du verstehst was ich damit meine.

Liebe Grüße

Robert

Neinnein, erstens bezeichne ich mich nicht als Codingcrack, zweitens muß ich das selber erstmal überblicken können. Wer von uns schließlich zu umständlich gedacht hatte, wird sich weisen.

Wo schaltest Du am Pult auf PFL? An der Taste über dem Regler für den entsprechenden Player? (Dahingehend mein obiger Gedanke.)

Detaillierte Grüße

TSD

nein leider nicht - ist auch hier kompliziert, da das X32 keine Midi Befehle für das Drücken von PFL Tasten sendet. Ich benutze hier eine Mute-Group, die die entsprechenden Ausgänge mutet. Ist wie gesagt kompliziert und umständlich, da das X32 hier leider keine Midi Befehle sendet (oder auch empfängt). Ich möchte nur ExtraPFL nutzen, da sich mir der Sinn des Vorhörens eines Ausspielkanals nicht wirklich erschließt. Es reicht auch für die Anwendung, die ich plane.

Liebe Grüße

Robert

Also im Prinzip wie eine Extratastatur, nur daß sie im Pult eingebaut ist. Wieder was klarer, und mein Gedanke hat sich erledigt. Den Rest kriegen wir auch noch zum laufen, aber jetzt ist bei mir erstmal Pause.

Hinhaltende Grüße

TSD

genau, nur dass diese Taste im Pult auch noch eine PFL-Mimik durch geschicktes Routing/Muting umsetzt ohne PFL (beim X32 heißt das “Solo”)am Pult zu benutzen.

ich hab gerade nur das Problem, dass der MidiOut Befehl nicht gesendet wird, wenn ich an Mairlist auf PFL schalte. Umgekehrt funktioniert es.

Liebe Grüße

Robert

Echt nicht, das Teil hat doch eine sehr umfangreiche Midi Implemetierung und sogar einen reinen DAW mode, wenn ich mich recht entsinne. Bzw. OSC bzw. das Rauschinger proriptäre etwas, was auch schon entschlüsselt wurde und per LAN funktioniert.

nein - X32 sendet/empfängt keine Midi Befehle bei PFL on/off. Kann sein, dass es über den Umweg der Fernsteuerung oder DAW Mode gehen würde - so tief wollte ich aber nicht einsteigen. Da fehlt mir die Zeit für.

Im DAW Mode muss es außerdem ständig Rückmeldungen geben bzw. per Midi/LAN eine feste Verbindung zu einer gültigen Fernsteuerungskonsole geben. Ist also leider nicht so einfach - nicht unmöglich, aber zeitaufwendig.

Liebe Grüße

Robert

Was mir gerade einfällt: Ist in der procedure OnLoad(…) auch eine Zeile

MidiOutOpen(1);

untergebracht? (Und in … OnUnload entsprechend MidiOutClose(1);.) Die gehören da hin.

Ergänzte Grüße

TSD

Ich hab es jetzt pragmatisch gelöst, indem ich Mairlist verboten habe mehr als ein Eigenschaftsfenster zu öffnen, was jetzt auch funktioniert mit diesem Script:

procedure OnPFLOn(Item: IPlaylistItem; PFLCount: integer);
begin
if PFLCount = 1 then
MidiOut(1, $B1, $50, $00); 
MidiOut(1, $B1, $32, $7F);
MidiOut(1, $B1, $33, $7F); 
end;

procedure OnPFLOff(Item: IPlaylistItem; PFLCount: integer);
begin
if PFLCount = 0 then
MidiOut(1, $B1, $50, $7F); 
MidiOut(1, $B1, $32, $00);
MidiOut(1, $B1, $33, $00); 
end;

procedure OnExecuteCommand(Command: string);
begin
if Command = 'X32PFLON' then 
ExecuteCommand('PLAYLIST 1 EXTRAPFL ON')
else if Command = 'X32PFLOFF' then 
ExecuteCommand('PLAYLIST 1 EXTRAPFL OFF')
  
end;

begin
end.

Jetzt habe ich nur noch ein weiteres Problem:
Wenn ich die Cartwall auf PFL stelle und mir einen Hotkey für z.B. Play Cart 1 auf ctrl+1 lege, startet nicht nur die cart , sondern auch ein ExtraPFL des angewählten Titels in der Playliste. Warum ist das so? Ich sende ja ausschließlich den Befehl “CARTWALL 1 START/STOP”?

Liebe Grüße

Robert

Das sehe ich so nicht. Kann aber an mir liegen. (Wofür stehen die $50, $32 und $33 genau?)

Ich dachte, Dein primäres Problem wäre, daß das X32 nicht auf die MidiOut-Befehle von mAirList hört. Dazu meine obige Frage.

Nachgehakte Grüße

TSD