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.
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.
@RetroKiste: Probiere bitte mal Build 6018 aus und teste. Danke.









