MIDI - APCmini - Cartwall

Habe (0) ausprobiert, klappt leider nicht.

Tja, dann geht’s nur mit Screenshot der Midi-Konfiguration und dem Skript als solchem (als Code formatiert!).

Setze mich morgen mal dran und sende alles mal hoch.

Moin, hier mein Code in formatierter Form, wie ich ihn an meinem anderen Computer seit einem Jahr verwende. Anschließend noch ein paar Fotos meines Computers.

var
  i: integer;
  MIDI_PORT: integer;  // <- neu: der gefundene MIDI-Out-Port (2..8)

procedure Taste(Index, Mode: integer);
var
  Colour: integer;
begin

  if (Index >= 0) AND (Index < 8) then
    Colour := 96
  else if (Index >=  8) AND (Index < 24) then
    Colour := 45
  else if (Index >= 24) AND (Index < 40) then
    Colour := 106
  else if (Index >= 40) AND (Index < 63) then
    Colour := 76
  else if (Index >= 64) AND (Index < 128) then
    Colour := 0
  else
    exit;

  if (Mode < 0) OR (Mode > 2) then
    exit;

  if (Index >= 0) AND (Index < 64) then
  begin
    case Mode of
      1: Mode := $96;
      2: Mode := $9D;
    else
      begin
        Mode := $96;
        Colour := 0;
      end;
    end;

    // vorher: MidiOut(0, ...)
    MidiOut(MIDI_PORT, Mode, Index, Colour);
  end

  else if (Index >= 64) AND (Index < 78) then
    // vorher: MidiOut(0, 90, ...)
    MidiOut(MIDI_PORT, 90, Index, Mode);

end;


// Hilfsfunktion: versucht, einen MIDI-Out-Port stabil zu öffnen
function TryOpenPort(p: integer): boolean;
var
  t: integer;
begin
  Result := false;

  // ein kleines Startfenster geben (mAirList 8 Initialisierung)
  // (kein blindes "Sleep(3000)" allein, sondern mit Retry)
  for t := 1 to 60 do  // ~6 Sekunden (60 * 100ms)
  begin
    try
      MidiOutOpen(p);
      Result := true;
      exit;
    except
      Sleep(100);
    end;
  end;
end;


procedure OnLoad;
var
  p: integer;
  opened: boolean;
begin
  MIDI_PORT := -1;
  opened := false;

  // mAirList 8: erstmal kurz Luft geben, bevor wir Ports scannen
  Sleep(1500);

  // --- Scan: MIDI OUT 2 bis 8 ---
  for p := 2 to 8 do
  begin
    if TryOpenPort(p) then
    begin
      MIDI_PORT := p;
      opened := true;
      break;
    end;
  end;

  // Wenn keiner der Ports aufging: Script ruhig beenden (kein Crash)
  if not opened then
    exit;

  // Ab hier: dein bisheriger OnLoad-Inhalt, unverändert
  ExecuteCommand('CARTWALL ALL STOP');

  for i := 0 to 127 do
    Taste(i, 1);

  // vorher: MidiOut(0, $90, ...)
  MidiOut(MIDI_PORT, $90, 100, 01);
  MidiOut(MIDI_PORT, $90, 101, 01);
  MidiOut(MIDI_PORT, $90, 106, 01);
  MidiOut(MIDI_PORT, $90, 107, 01);
end;

procedure OnUnload;
begin
  // Wenn nie ein Port gefunden wurde, nichts tun
  if MIDI_PORT < 0 then
    exit;

  for i := 0 to 127 do
    Taste(i, 0);

  // vorher: MidiOutClose(0)
  MidiOutClose(MIDI_PORT);
end;


procedure OnCartwallPlayerStateChange(PlayerIndex: integer;
  OldState: TPlayerState; NewState: TPlayerState;
  Item: IAudioCartwallItem; PlaylistItem: IPlaylistItem;
  OnAirMode: TCartwallOnAirMode);
var
  Index: integer;
begin
  // Wenn kein Port gefunden wurde, keine LED-Aktionen
  if MIDI_PORT < 0 then
    exit;

  Index := 63 - (7 - ((PlayerIndex - 1) mod 8))
    - (8 * trunc((PlayerIndex - 1) / 8));

  if NewState = psPlaying then
    Taste(Index, 2)
  else if NewState = psStopped then
    Taste(Index, 1);
end;


procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer;
  OldState: TPlayerState; NewState: TPlayerState; Item: IPlaylistItem);
begin
  // Wenn kein Port gefunden wurde, keine LED-Aktionen
  if MIDI_PORT < 0 then
    exit;

  if NewState = psPlaying then
    Taste(PlayerIndex + 67, 2)
  else if NewState = psStopped then
    Taste(PlayerIndex + 67, 1);
end;


begin
end.









Kleiner Nachtrag, bei der Fernsteuerung taucht noch der auf:

Das ist nicht das Skript, welches ich weiter oben mal gepostet habe. Welche „KI“ hast Du denn da dran gelassen? Wenn Du wirklich Fehler suchenfinden willst, dann gehe von dem aus, mit welchem es funktioniert hatte.

Du hast recht, da habe ich einen Fehler gemacht und scheinbar was falsches Kopiert, habe eben deinen Skript in meine Cloud deladen und probiere es nachher aus.

var
  i: integer;


procedure Taste(Index, Mode: integer);
var
  Colour: integer;
begin

  MidiOut(1, $90, 100, 01);
  MidiOut(1, $90, 101, 01);
  MidiOut(1, $90, 104, 01);
  MidiOut(1, $90, 105, 01);
  MidiOut(1, $90, 106, 01);
  MidiOut(1, $90, 107, 01);

  if (Index >= 0) AND (Index < 8) then
    Colour := 96
  else if (Index >=  8) AND (Index < 24) then
      Colour := 45
  else if (Index >= 24) AND (Index < 40) then
    Colour := 106
  else if (Index >= 40) AND (Index < 64) then
    Colour := 76
  else if (Index >= 64) AND (Index < 128) then
    Colour := 0
  else
    exit;
    
  case Mode of
    1: Mode := $96;
    2: Mode := $9D;
  else
    begin
      Mode := $96;
      Colour := 0;
    end;
  end;
  
  MidiOut(1, Mode, Index, Colour);
end;


procedure OnLoad;
begin
  
MidiOutOpen(1); 
  
  ExecuteCommand('CARTWALL ALL STOP');
  
  for i := 0 to 63 do
    Taste(i, 1);
    
 end;

procedure Unload;
begin
  for i := 0 to 63 do
    Taste(i, 0);
    
  MidiOutClose(1);
end;


procedure OnCartwallPlayerStateChange(PlayerIndex: integer;
  OldState: TPlayerState; NewState: TPlayerState;
  Item: IAudioCartwallItem; PlaylistItem: IPlaylistItem;
  OnAirMode: TCartwallOnAirMode);
var
  Index: integer;
begin
  Index := 63 - (7 - ((PlayerIndex - 1) mod 8))
    - (8 * trunc((PlayerIndex - 1) / 8));

  if NewState = psPlaying then
    Taste(Index, 2)
  else if NewState = psStopped then
    Taste(Index, 1);
end;

Ich habe diesen Skript verwändet, habe jetzt auf meinem Rechner mAirList 7,4 da geht er und habe auch mAirList 8 drauf und da geht er nicht.

Würde aber gerne 8 verwänden.

@Tondose
Könnte das ein ähnliches oder das gleiche Problem sein wie hier?

Also geänderte Reihenfolge der MIDI Geräte bzw. mehr oder weniger MIDI Geräte?

Die Fehlerbeschreibung sehen verdächtig gleich aus.

Dann klingeln wir mal @Torben an, vielleicht fällt ihm ja was dazu ein. Entweder es liegt an der Reihenfolge (was in diesem Fall hier noch nicht geklärt ist) oder ein Fehler in v8 vor.

1 Like

@RetroKiste: Probiere bitte mal Build 6018 aus und teste. Danke.