[X-Air XR18] Motorfader & mAirList

Was mich ein wenig nachdenklich macht sind die ersten Zeilen des Scripts. Alles was nicht mit // im Code ausgeklammert ist wird in der normalen Programierung eigentlich als Ausführung oder Befehl verstanden. Diese würde ich zum test auf jeden fall mal mit // versehen.
Also Version und Scriptname.
Diese sind zu 100% nicht scriptrelevant und somit auch auszuschließen. :sunglasses:

Ja habe ich gemacht. Jetzt sieht es so aus…

begin

//Called when Script is loaded
procedure OnLoad;
begin
	MidiOutListDevices;
		1: X18/XR18 MIDI IN;
		MidiOutOpen(1);
end;

// Called before mAirList shutdown
procedure OnUnload;
begin
	MidiOutClose(1);
end;


//Steuerung

//A Start
procedure PLAYER 1-1 START;
begin
	MidiOut(1, $B0, $04, 5F); // device, status, data1, data2
end;

//A Stop
procedure PLAYER 1-1 STOP;
begin
	MidiOut(1, $B0, $04, 00); // device, status, data1, data2
end;

//B Start
procedure PLAYER 1-2 START;
begin
	MidiOut(1, $B0, $06, 5F); // device, status, data1, data2
end;

//B Stop
procedure PLAYER 1-2 STOP;
begin
	MidiOut(1, $B0, $06, 00); // device, status, data1, data2
end;

end.

ist aber immernoch diese Fehlermeldung

1 Like

Was möchte uns diese Fehlermeldung sagen?
image

Ich weiß es leider nicht aber wir warten einfach mal ab. :smile:

Das begin in der ersten Zeile und das end. in der letzten Zeile löschen.

Habe ich jetzt gemacht, jetzt kommt aber: [Error] (19:19): Identifier expected

und das ist an der Stelle wo
procedure PLAYER 1-1 STOP
steht die erste 1

Ich habe das Script nochmal umgebaut, mit einem Forenbeitrag von 2009: Midi-Out Script

//Called when Script is loaded
procedure OnLoad;
begin
	MidiOutListDevices;
		MidiOutOpen(1);
end;

// Called before mAirList shutdown
procedure OnUnload;
begin
	MidiOutClose(1);
end;


//Steuerung

//Start
procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer);
begin
if PlayerIndex = 0 then
MidiOut ( 1, $B0, $04, $5F ) ;
if PlayerIndex = 1 then
MidiOut ( 1, $B0, $06, $5F ) ;
end;

//Stop
procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue);
begin
if PlayerIndex = 0 then
MidiOut ( 1, $B0, $04, $00 ) ;
if PlayerIndex = 1 then
MidiOut ( 1, $B0, $06, $00 ) ;
end;

begin
end.

Aber jetzt zeigt er mir das hier an:


und

Hiho,
ui, ich hatte mich grade schon gewundert wieso ich eine Mail von einem Post aus 2009 bekomme :slight_smile:
Was ich vorweg nehmen möchte ist daran zu denken dass ich das Script aus 2009 damals noch auf der MAirList 306 geschrieben habe.

Leider nutze ich MAirList nicht mehr (nicht wegen dem Programm sondern weil ich soweit alles aus beruflichen Gründen an den Nagel gehangen habe) daher habe ich da auch nicht aktiv weiter gescriptet (zumal mir vor 8 Monaten dann leider auch noch mein Tascam explodiert ist :frowning: )

Ich versuche das mal alles von damals zu rekonstruieren in der Hoffnung das es so halbwegs passt.

Was mir auffällt (und ich nicht weiß ob es noch so ist wie früher…) du hast die HEX Werte bei Midi Out angegeben.
In meinem Script steht der nette Hinweis" //Remember: All values will set in decimal system, but in MidiIn check you will see them as hex values."

Sprich, rechne mal deine HEX Werte in Dezimal um und trage diese dann ein :slight_smile:
Also:
MidiOut (1, 176, 4, 95) anstatt MidiOut (1, $B0, $04, $5F)
MidiOut (1, 176, 6, 95) anstatt MidiOut (1, $B0, $06, $5F)

Die Devicenumber kannst du auch irgendwie auslesen. Prüfe ob Device 1 die richtige Nummer für deinen Mischer ist (ich vermute aber schon wenn du nicht so ein irrsinniges Setup hast)

Grüße
Der Verbrecher des Scriptes aus 2009 :smiley:

1 Like

Hallo, danke erstmal für deine Antwort,
ich habe die Midi Werte jetzt mal in Dezimal umgeschrieben, leider funktioniert es immer noch nicht.

Hallo,
ich habe mir grade mal die neue Version zu Gemüte geführt (zumindest mal die Script Befehle).
1.) Mein Kommando mit den Dezimalwerten zurück. Mittlerweile sind es wohl doch HEX-Werte geworden :frowning:

Ich vermute mal eher das er irgendwo hingreifen will wo eigentlich gar nix ist.

Du lässt dir ja in dem SystemLog die MidiOut devices anzeigen (mit MidiOutListDevices). Hat dein Mischer denn auch die ID 1 (für MAirList = Midi Out, an deinem Mischer natürlich Midi In)?
Ist der Mischer denn bereit auch Mididaten zu empfangen? In meinem musste ich das extra im Mischer aktivieren.

Sollte dein Midi Device wirklich die 1 sein so ist der Abschnitt “OnLoad” schonmal korrekt.

Wenn ich das XR18 Midi Manual richtig verstehe:
Wird dein Mischer 3 Midikanäle haben.

Du musst also rausfinden auf welchem Mididevice der Channel 1 liegt (das ist die entsprechende Nummer aus der Device Liste)

Es wäre dann (wenn es Device 1 ist): MidiOut (1, ??, $04, $5F)

Das $B0 müsste ja folgendem entsprechen: Controlchange = B und die 0 wäre Kanal 0
Du steuerst also Fader 4 auf ca. 99% auf.
Soweit hattest du also alles richtig.

Ich rieche den Hasen tatsächlich in dem Datenstring oder der Devicenumber.
Ich Google mal noch ein wenig durch die Gegend.

Vielleicht ist ja noch jemand hier der es aktuell kennt (bei mir ist es so tödlich lange her)

So Nachtrag nach Telefonat mit Kollegen dem ich die Frage gestellt habe.

Dein String ist soweit in Ordnung.
$B0 = Control change
$04 = Fader 4
$5F = Wert 95 (von 0…127) für Faderlevel

Er meinte auch das es nur an der eigentlichen Device Nummer liegen könnte.
Daher da nochmal hinschauen. Wenn er dir mehrere Devices anzeigt einfach mal durch probieren. (In meinen alten Notizen habe ich gefunden das ich damals die Geräte 1-3 auch nicht hatte weil die durch irgendwas anderes belegt waren)

Grüße

Peter

Gute Nachrichten, ich habe es mit deinen Ratschlägen nochmal Probiert, und es Funktioniert.

Es war die Falsche Device Nummer… die 2 wäre es gewesen.

Eine Frage habe ich aber noch, wie spreche ich eine 2 Playlist an?

Ich habe eine 2 Playlist mit einem Player für Jingles, wie spreche ich den im Script an?

Ich muss nochmal ein bisschen Zurückrudern. Ich habe jetzt in das Script noch eingefügt, das der Jeweilige Mute Button (am Pult) An und Aus geht, da darüber auch die Player gestartet und gestoppt werden…

Jedoch Startet er immer beide Player und entmutet beide Channel, wenn ich nur einen von beiden drücke.

Aktuelles Script:

//Called when Script is loaded
procedure OnLoad;
begin
	MidiOutListDevices;
		MidiOutOpen(2);
end;

// Called before mAirList shutdown
procedure OnUnload;
begin
	MidiOutClose(2);
end;


//Steuerung

//Start
procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer);
begin
if PlayerIndex = 0 then
MidiOut (2, $B0, $04, $5F); 
MidiOut (2, $B1, $04, $00); 

if PlayerIndex = 1 then
MidiOut (2, $B0, $06, $5F); 
MidiOut (2, $B1, $06, $00);
end;

//Stop
procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue);
begin
if PlayerIndex = 0 then
MidiOut (2, $B0, $04, $00);
MidiOut (2, $B1, $04, $7F); 

if PlayerIndex = 1 then
MidiOut (2, $B0, $06, $00);
MidiOut (2, $B1, $06, $7F);
end;


begin
end.

Wenn ich die Fernsteuerung in der mAirList Konfig verwende fährt er sogar beide Fader gleichzeitig hoch.

Hallo,
schön zu hören das der Fehler gefunden wurde :slight_smile:
Zu dem Thema mit der zweiten Playlist.
Ehrlich gesagt habe ich mich da rum gedrückt indem ich mir 12 Cartwalls aufgemacht habe welche vorbelegt waren und als Action (Erstellt in dem Eventplaner von MAirList) mit dem entsprechenden Jingle abgefahren wurden :slight_smile:
Die Cartwalls hatte ich in 2 Gruppen auf 2 Kanäle gelegt (grade und ungrade Cartwall Nummern).
Dadurch ist der Befehl so ähnlich (gewesen).

Hier erstmal der Umweg:
Lege dir z.B. 12 Cartwalls an (schön klein irgendwo in der Ecke versteckt). Diese kannst du ja mit einer eigenen PL laden.

Deklariere dir 2 globale Variablen vom Typ Integer. Also noch vor deinem ersten “begin”. Das ist nötig da wir den Wert der Variablen in mehreren Prozeduren benötigen.

var 
C1: integer;
C2: integer;

dann als neue Funktionen:
//**********************************************************************************************************
//Start cartwall and fader control (at least one cartwall player started then fader up)

procedure OnCartPlayerStart(PlayerIndex: integer);
begin
case PlayerIndex of
	0,2,4,6,8,10: begin
			c1 := c1 + 1;
			MidiOut ( devicenr, 188, 03, 95 ) ; //Fader 29
			end;
	1,3,5,7,9,11: begin
			c2 := c2 + 1;
			MidiOut ( devicenr, 190, 03, 95 ) ; //Fader 31
		end;
end;
end;
//**********************************************************************************************************
//**********************************************************************************************************
//stop cartwall and fader control (if all cartwall player of one group (even / odd) are off then fader `down)`

procedure OnCartPlayerStop(PlayerIndex: integer; Duration: TTimeValue);
begin
case PlayerIndex of
	0,2,4,6,8,10: begin
		c1:= c1 - 1
		end;
   	1,3,5,7,9,11: begin
		c2:= c2 - 1
		end;
	end;
if (c1 = 0)  then MidiOut ( devicenr, 188, 03, 00 ) ;
if (c2 = 0)  then MidiOut ( devicenr, 190, 03, 00 ) ;

end;

Die Zeilen mit dem MidiOut kennen wir ja jetzt. :slight_smile: Die musst du dir entsprechend anpassen (sind noch die Tascam Parameter)
Was passiert hier?
In dem ersten Teil prüfe ich zu welcher Gruppe der Cartplayer gehört der gestartet wurde (grade Zahlen oder ungrade Zahlen der Player Nummern damit ich weiß zu welchem Fader die gehören).

Die variablen c1 und c2 dienten mir als Krücke wenn ich mal, warum auch immer 2 oder mehr Jingles hintereinander abgefeuert habe.
Hierdurch wusste ich wie viele Carplayer aus einer Gruppe gestartet wurden bevor alle gestoppt waren.
Da wir ja nur einmal den MidiOut Befehl für eine Gruppe verwenden wäre es ja doof wenn der Kanal nach dem ersten Jingle zu gemacht wird und das zweite Jingle aus der gleichen Gruppe stumm läuft.

Wenn jetzt ein Cartplayer also seine Wiedergabe beendet hat so habe ich von der Variable wieder einen Player abgezogen und erst wenn die Variable den Wert Null hatte habe ich den Fader zugemacht (in der Procedure OnCartPlayerStop) da dann keine Cartwall aus der Gruppe mehr aktiv war.

Dann habe ich aus der MAirlIst Oberfläche die Cartwalls mit den entsprechenden Playlisten gefüttert und eben durch Zeitgesteuerte Events abgefahren.
Das Jingle wurde entsprechend zur eingestellten Zeit abgefahren und nachdem die Cartwall gestoppt war wurde der nächste Titel aus der Playlist für die Cartwall geladen. (Rein theoretisch kannst du dir also für jede Cartwall eine eigene PL anlegen welche dann rotiert)

Klingt vielleicht komisch, hat aber funktioniert :smiley:

Du kannst natürlich auch anstelle der Cartwall einen dritten “normalen” Player nutzen.
Dieser hat dann die nächste Player ID.

In deinem bisherigen Script müsstet du dann folgendes reinpacken.

In der “OnPlayerStart” fügst du vor dem “end;” die beiden Zeilen ein.
if PlayerIndex = 2 then
MidiOut ( 2, $B0, $06, $5F ) ;

In der “OnPlayerStop” entsprechend:
if PlayerIndex = 2 then
MidiOut ( 2, $B0, $06, $00 ) ;

Den Kanal natürlich entsprechend anpassen

Ein kleiner Ratschlag am Rande da ich nicht weiß wie dein Equipment noch so aussieht oder was du in Zukunft noch planst (z.B. Pushpanel zum Abfeuern von allem möglichen Zeugs)

Im Moment packst du ja deine Device Number direkt als Zahl in den MidiOut Befehl.
Solltest du mal ein weiteres Midigerät hinzu bekommen kann es passieren das sich beim ersten einrichten die bisherige Devicenumber ändert.

Ich hatte mir die Devicenumber damals als globale Variable hinterlegt so dass, wenn ich die mal anpacken musste, nur ein einziges Mal ganz oben im Code ändern musste und nicht überall.

Wo wird das gemacht?
Ganz oben wo du jetzt auch die Variablen c1 und c2 deklariert hast.
Direkt in der Zeile da drunter.

Wie sieht das aus?
const XR18 = 2;

Jetzt musst du nur einmal bei den ganzen MidiOut Befehlen die 2 gegen XR18 tauschen. (auf gleiche Schreibweise achten)

Wenn sich jetzt die Nummer ändert (warum auch immer) brauchst du nur oben die Zahl bei der Zuweisung anpassen und alles läuft wieder.

Noch ein Nachtaktiver :slight_smile:
Ok, zu deinem Post bezüglich dem Mute Button.
Hier kann man in eine böse Falle laufen.
Man sollte hier unterscheiden ob man in einer Automation oder manuellen Betrieb arbeitet.
Der Unterschied:
Im manuellen Betrieb startest du den entsprechenden Player ja irgendwie von Hand (z.B. über den Mute Button wenn ich dich richtig verstanden habe).

In der Automation füttern sich die Player ja selber und starten sich auch selber sobald der andere Track dem Ende entgegen geht.
Steuerst du jetzt die Sache an die Mute Funktion des Mischers was du ja laut Script machst, so mutest du ja auch den Kanal sofort was ein unschöner Effekt ist da der entsprechende Kanal ja sofort stumm ist, auch wenn da noch Outros laufen (beste Beispiel Coheed and Cambria die gerne so 20-30 Sekunden Outro haben was ggf. abrupt abgeschnitten würde) aber du schon 5 Sekunden vor Track Ende die Überblendung aktiv hast.

Ich habe so das Gefühl das du so die gleichen Ideen hast wie ich früher. Alles mit maximal 2 Knöpfen zu bedienen und am besten noch alle möglichen Statis auf einem Knopf zu sehen (z.B. Player läuft, gestoppt, Pause, Fehler beim laden, Achtung Track gleich zu Ende usw… :smiley: )

Aber hier die Info warum er nicht das macht was er soll:
Wenn du in einer IF THEN Anweisung mehr wie ein Kommando ausführen willst so muss da ein “kleines” begin / end rein.

if PlayerIndex = 0 then begin
    MidiOut (2, $B0, $04, $5F); 
    MidiOut (2, $B1, $04, $00);
end;

das funktioniert immer und man muss nicht dran denken wieviel Zeugs man zu der entspechenden Bedingung packt.

Zum Beispiel ist es bei mir immer so gewesen (das hat mir lästiges suchen erspart wenn ich komische Phänome hatte):

if PlayerIndex = 1 then begin
	MidiOut ( devicenr, 186, 03, 95 ) ;
end;

Ich kann dir gerne mal per PN das gesamte Script von mir schicken, da sind so ein paar Nettigkeiten drin, wenn auch nicht viele.
Dazu gehört aber:

  • Prüfen ob in Automation oder nicht und entsprechend die Fader einstellen
  • Steuerung der 12 Cartwalls (Fader)
  • Steuerung der beiden Mainplayer (Fader)
  • Optische Statusanzeige der Player / Cartwalls

Dann kannst du auch besser sehen wie ich die Variablen deklariert habe und so nen Zeugs.

Einfach Bescheid geben.

Verdammt, jetzt hab ich wieder Bock auf Scripten :D:D aber keine aktuelle Version und keinen Mischer mehr mit Motorfader :smiley:

Frage an unsere Moderatoren (wenn das jemand mitbekommt und auch noch weiß):
Es gab in der MAirList306 so ein schönes Helpfile was da hieß: mAirListScript.chm
Gibt es die auch in der aktuellen Version?
Ich glaube das kann den Leuten die grade mit dem Scripten anfangen doch sehr helfen.

In diesem Sinne eine gute Nacht und kriegt keine Alpträume wo ihr von Befehlen oder Fadern angegriffen werdet :smiley: :smiley:

Scripten macht Spaß wenn man einmal ein Gefühl dafür bekommen hat.

Grüße

Peter

… in Verbindung mit …

Und noch einer der nicht schlafen kann :slight_smile:
Danke für die Info und vor allem auch ein Großes Dankeschön an Tondose.
Er / Sie hat da ja wirklich schon richtig tief gegraben.
Ist empfehlenswert da rein zu schauen.

Tondose (m) hat noch sehr viel mehr gemacht.

Zusammmenstellung seiner gesammelten Werke u.a. hier:

(Ab “Scripting” bzw. Tutorials)

Jetzt Funktioniert es wirklich so wie es soll.


EDIT by Mod - alles nachfolgende, das ein neues Thema wurde, habe ich in einen neuen Thread ausgelagert:

3 posts were merged into an existing topic: Padding (Sweeper on Ramp)

bezüglich der Jingle Playlist mit dem Jingle Player (2-1) ich habe mal ausprobiert:

if PlaylistIndex = 2 then begin
MidiOut (2, $B0, $08, $00); 
MidiOut (2, $B1, $08, $7F); 
end;

Er startet aber den Fader von der Main Playlist (1-1)