Launchpad pro Midi Out

Hallo Gemeinde,
ich habe mir das Novation Launchpad pro zugelegt und möchte Mairlist damit fernsteuern. Soweit funktioniert auch alles, doch nun würde ich gerne die led ansteuern, z.B. erster Player steht Grünes Pad, Player läuft, rotes Pad, eof Pad blinkt rot.
ich habe im forum schon gesucht, aber nichts brauchbares gefunden. auch habe ich ein script gefunden welches für das ältere launchpad geschrieben wurde, aber dieses ist mit meinem pad nicht kompatibel.
Ich benutze mAirlist 5.3 build 3144
ich bin sehr dankbar für lösungsansätze, bzw hilfe beim schreiben des scriptes.

vielen dank im voraus
jörg

niemand eine Ahnung?

hab jetztb einen kleinen codeschnipsel zusammen, vllt kann sich den jemand mal ansehen…
bekomme Fehlermeldung :
(15:8) Unknown Identifier PlayerIndex[code]procedure OnLoad;
begin
MidiOutOpen(5);
MidiOutListDevices;
end;

/////////////////////////////////////// Player///////////////////////////////////////////////////
procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer);
begin
if (PlayerIndex = 0) then
MidiOut ( 5, 144, 11, 22 ); // Player A grün
MidiOut ( 5, 144, 14, 60 ) //Stop Player A rot
end;
begin
if (PlayerIndex = 1) then
MidiOut ( 5, 144, 15, 22 ); // Player B grün
MidiOut ( 5, 144, 18, 60 ); // Stop Player B rot
end;
procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue);
begin
if (PlayerIndex = 0) then
MidiOut ( 5, 144, 11, 60 ) // Player A rot
MidiOut ( 5, 144, 14, 22 )
end; // Stop Player A Grün
begin
if (PlayerIndex = 1) then
MidiOut ( 5, 144, 15 , 60 ) // Player B rot
MidiOut ( 5, 144, 18 , 22 ); //Stop Player B grün
end;
[/code]

Zähl mal die “if” in Verbindung mit den “begin”/“end” durch, da stimmt was nicht. Vermutlich meinst du:

procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer);
begin
  if (PlayerIndex = 0) then begin
    MidiOut ( 5, 144, 11, 22 );   // Player A grün    
    MidiOut ( 5, 144, 14, 60 )    //Stop Player A rot
  end;
  if  (PlayerIndex = 1) then begin
    MidiOut ( 5, 144, 15, 22 );    // Player B grün
    MidiOut ( 5, 144, 18, 60 );   // Stop Player B rot
  end;
end;

procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue);
begin
  if (PlayerIndex = 0) then begin
    MidiOut ( 5, 144, 11, 60 )     // Player A rot
    MidiOut ( 5, 144, 14, 22 )
  end;     // Stop Player A Grün
  if (PlayerIndex = 1) then begin
    MidiOut ( 5, 144, 15 , 60 )    // Player B rot  
    MidiOut ( 5, 144, 18 , 22 );    //Stop Player B grün
  end;
end;

hab es so gemacht wie du geshrieben hast, nun sagt mairlist: 14:3) Begin expected

Poste bitte nochmal das ganze Script in der jetzt aktuellen Version.

zunächst mal danke das du mir hilfst…
hie die aktuielle:

[code]procedure OnLoad;
begin
MidiOutOpen(5);
MidiOutListDevices;
end;

/////////////////////////////////////// Player///////////////////////////////////////////////////
procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer);
begin
if (PlayerIndex = 0) then
MidiOut ( 5, 144, 11, 22 ); // Player A grün
MidiOut ( 5, 144, 14, 60 ) //Stop Player A rot
end;
if (PlayerIndex = 1) then
MidiOut ( 5, 144, 15, 22 ); // Player B grün
MidiOut ( 5, 144, 18, 60 ); // Stop Player B rot
end;
end;

procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue);
begin
if (PlayerIndex = 0) then
MidiOut ( 5, 144, 11, 60 ) // Player A rot
MidiOut ( 5, 144, 14, 22 ) // Stop Player A Grün
end;
if (PlayerIndex = 1) then
MidiOut ( 5, 144, 15 , 60 ) // Player B rot
MidiOut ( 5, 144, 18 , 22 ); //Stop Player B grün
end;
end;
[/code]

Ich schließe mich der Meinung des Compilers an.

Du hast die “begin” hinter den “then” vergessen.

vielen dank, nun geht es.
doch sobald ich einen player starte kommt eine handling message: PAYERCONTROL_STOP 521216544C8A85AB 00 0000000000 0000000000 7,531 ?
was könnte dies bedeuten?

nun verzweifle ich bald.
habe den code nun erweitert und bekomme nun (62:11): identifier expected:

[code]procedure OnLoad;
begin
MidiOutOpen(5);
MidiOutListDevices;
midiout( 5 , 176 , 0 , 0 );
midiout( 5 , 176 , 0 , 40);
end;
/////////////////////////////////////////On Air Status///////////////////////////////////////////
procedure OnOnAir();
begin
midiout(5,144, 41, 22);
end;

procedure OnOffAir();
begin
midiout(5,144, 31, 60);
end;

////////////////////////////////////////Automation Status///////////////////////////////////////
procedure OnAutomationOn(PlaylistIndex: integer);
begin
midiout(5,144, 42, 22);
end;

procedure OnAutomationOff(PlaylistIndex: integer);
begin
midiout(5,144, 32, 60);

end;

/////////////////////////////////////// Player Status////////////////////////////////////////////
procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer ;OldState: TPlayerState; NewState: TPlayerState);
begin
if (PlayerIndex = 0) then
begin
if (NewState = psLoaded) then
begin
MidiOut ( 5, 144, 11, 22 ); // Player A grün
MidiOut ( 5, 144, 14, 60 ); //Stop Player A rot
end;
if (NewState = psStopped) then
begin
MidiOut ( 5, 144, 11, 60 ); // Player A rot
MidiOut ( 5, 144, 14, 60 ); // Stop Player A Grün
end;
begin
if (PlayerIndex = 1) then
begin
if (NewState = psLoaded) then
begin
MidiOut ( 5, 144, 15, 22 ); // Player B grün
MidiOut ( 5, 144, 18, 60 ); // Stop Player B rot
end;
if (NewState = psStopped) then
begin
MidiOut ( 5, 144, 15 , 60 ); // Player B rot
MidiOut ( 5, 144, 18 , 60 ); //Stop Player B grün
end;
end;
begin;
end;[/code]
61 ist meine letzte zeile

Wahrscheinlich passen die begin/end nicht zueinander. Ein end zuviel oder so.

Vielleicht solltest du als erstes mal die Einrückungen richtig machen, damit der Code lesbar bleibt:

  • begin ans Ende der Zeile (oder optional in eine eigene Zeile darunter)
  • den Code innerhalb des begin/end-Blockes zwei Leerzeichen eingerückt
  • das abschließende end dann wieder zurückgerückt

So siehst du auch schnel, ob jedes begin ein passendes end hat.

ich hoffe dsas ich dich richtig versanden habe:[code] procedure OnLoad;
begin
MidiOutOpen(5);
MidiOutListDevices;
midiout( 5 , 176 , 0 , 0 );
midiout( 5 , 176 , 0 , 40);
end;
/////////////////////////////////////////On Air Status///////////////////////////////////////////
procedure OnOnAir();
begin
midiout(5,144, 41, 22);
end;
procedure OnOffAir();
begin
midiout(5,144, 31, 60);
end;
////////////////////////////////////////Automation Status///////////////////////////////////////
procedure OnAutomationOn(PlaylistIndex: integer);
begin
midiout(5,144, 42, 22);
end;
procedure OnAutomationOff(PlaylistIndex: integer);
begin
midiout(5,144, 32, 60);
end;
/////////////////////////////////////// Player Status////////////////////////////////////////////
procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer ;OldState: TPlayerState; NewState: TPlayerState);
begin
if (PlayerIndex = 0) then
begin
if (NewState = psLoaded) then
begin
MidiOut ( 5, 144, 11, 22 ); // Player A grün
MidiOut ( 5, 144, 14, 60 ); //Stop Player A rot
end;
end;

  if (NewState = psStopped) then

begin
MidiOut ( 5, 144, 11, 60 ); // Player A rot
MidiOut ( 5, 144, 14, 60 ); // Stop Player A Grün
end;

begin
if (PlayerIndex = 1) then
begin
if (NewState = psLoaded) then
begin
MidiOut ( 5, 144, 15, 22 ); // Player B grün
MidiOut ( 5, 144, 18, 60 ); // Stop Player B rot
end;
end;

if (NewState = psStopped) then

begin
MidiOut ( 5, 144, 15 , 60 ); // Player B rot
MidiOut ( 5, 144, 18 , 60 ); //Stop Player B grün
end;
end;

[/code]

[code] if (NewState = psStopped) then
begin
MidiOut ( 5, 144, 11, 60 ); // Player A rot
MidiOut ( 5, 144, 14, 60 ); // Stop Player A Grün
end;

begin
[/code]

Fehlt nach dem letzten end nicht noch ein

end;

? Und am Ende des Scripts muss auch noch eins. Wie Torben schon sagt. Jedes begin, braucht ein Ende, quasi wie ( und ).
Jeder Anfang braucht auch ein Ende, Neo.

vielen dank, aber nun bekomme ich: (27:11) unknown identifier “Player index”
schon komisch dieses pascal…
sorry, ich kann step 7 programmen, aber software anscheinend nicht…

bzw immer noch in zeile 37 :“identifier expected” letzte zeile ist aber 35:

[code] procedure OnLoad;
begin
MidiOutOpen(5);
MidiOutListDevices;

end;

/////////////////////////////////////// Player Status////////////////////////////////////////////
procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer ;OldState: TPlayerState; NewState: TPlayerState);
begin
if (PlayerIndex = 0) then
begin
if (NewState = psLoaded) then
begin
MidiOut ( 5, 144, 11, 22 ); // Player A grün
MidiOut ( 5, 144, 14, 60 ); //Stop Player A rot
end;
if (NewState = psStopped) then
begin
MidiOut ( 5, 144, 11, 60 ); // Player A rot
MidiOut ( 5, 144, 14, 60 ); // Stop Player A Grün
end;
begin
if (PlayerIndex = 1) then
begin
if (NewState = psLoaded) then
begin
MidiOut ( 5, 144, 15, 22 ); // Player B grün
MidiOut ( 5, 144, 18, 60 ); // Stop Player B rot
end;
if (NewState = psStopped) then
begin
MidiOut ( 5, 144, 15 , 60 ); // Player B rot
MidiOut ( 5, 144, 18 , 60 ); //Stop Player B grün
end;
end;[/code]

ok, nach einigem probieren gibt er keine compiler fehler mehr raus, doch nun kommt :"runtime error "list out of bounds(5191125) in background script… handling message: player control_statechange 4e2e50641787e7fb 00 000000000 0000000001

diesen fehler habe ich nun auch in den griff bekommen ;D
nun bräuchte ich noch die prozedur für encoder on air und encoder off air :frowning:
ist das in etwa so?:
procedure OnEncoderOnAir(PlaylistIndex: integer);
procedure OnAEncoderOffAir(PlaylistIndex: integer);
und warum erscheinen nun handling messages?
gruss jörg

Mach doch wirklich mal die Einrückungen richtig!

Das “begin” jeweils genauso weit eingerückt wie das “if” darüber, dann den Codeblock zwei Zeichen weiter eingerückt, und das “end” wieder so weit wie das “if”.

procedure sowieso;
begin
  if irgendwas then  
  begin
    blabla;
    blupblup;
    if nochwas then
    begin
      hihi;
      haha;
    end;
  end;
end;