Fader-Start mit dem MIDI-Controller “ APCmini“
Mit dem nachfolgenden Hintergrundscript ist mit dem MIDI- Controller „APCmini“ von AKAI auch ein Fader-Start, also beim Hochziehen des Kanalfaders, ein automatisches Starten des Musiktitels aus der Playliste, möglich.

Bild: APCmini von der Firma AKAI
Dazu sind nachfolgende Voraussetzungen notwendig:
- Es müssen 3 Player vorhanden sein (v.l.n.r.: Player1 (Farbe: gelb), Player2 (Farbe: grün), Player3 (Farbe: rot). Die 3 Farben repräsentieren die entsprechenden Tasten auf dem „APCmini“ sowie die Playeranzeigefarbe in der Playliste.
- In der MIDI Tabelle müssen teilweise MIDI-Steuerbefehle von Hand und in GROSSSchrift eingegeben werden.
Die MIDI-Tabelle sieht so aus:

Hinweis: alle Befehle sind in Großbuchstaben einzutragen.
Die Befehle „ACTIVE…“ sind keine MIDI-Befehle von mAirList und müssen daher per Hand eingetragen werden. Die MIDI-Befehle werden in nachfolgendem Hintergrundscript mit Namen abgefragt.
Ein Blick auf die Steuerfunktionen je Kanal (Chan. 1 bis 3):

Tasten in einem Kanalzug, die aktiv sind, blinken so lange, wie sie aktiv sind.
Alle Beispiele beziehen sich auf Fader 1 (gelten ebenso für die Kanäle 2 und 3).
Start eines Musiktitels je Kanal:
- Start nach Programmstart: alle Fader heruntergezogen (0% Volumen).
- Taste: „Chan.1 ON/OFF“ auf ON, sowie bei Kanal2 und 3 ebenso.
- Alle Kanäle sind nun startbereit. Beim Hochziehen der Fader eines oder mehrere Kanälen startet automatisch der angezeigte Musiktitel.
Beendigung eines Musiktitels je Kanal:
- Herunterziehen des entsprechenden Faders bis auf 0% Volumen
- Der nächste Musiktitel wird geladen und ist startbereit
- Ein Hochziehen des Faders startet den Musiktitel
Starten eines Musiktitels OHNE Einblenden, also direkt auf volle 100% Volumen:
- Kanal mit Taste „Chan.1 ON/OFF“ auf OFF
- Jetzt wird der angezeigte Musiktitel beim Hochziehen des Faders NICHT gestartet
- Fader auf 100% hochziehen
- Kanal mit Taste „Chan.1 ON/OFF“ wieder auf ON
- Mit Taste „Chan.1 Start/Fade Out“ den Musiktitel direkt starten mit voller Lautstärke (100% Volumen) von Beginn an (z. Bsp.: für Jingles oder Werbung)
- Ausblenden des Musiktitels durch Erneutes drücken der Taste „Chan.1 Start/Fade Out“, der Musiktitel wird innerhalb von 2-3 Sekunden langsam, automatisch ausgeblendet.
- Der noch hochgezogenen Fader kann jetzt heruntergezogen werden auf 0% Volumen. Bewirkt KEIN Starten eines Musiktitels (einzige Ausnahme beim Bewegen eines Faders).
- Alternative, den entsprechenden Fader zum Ausblenden des Musiktitels einfach auf 0% Volumen herunter ziehen.
- Erst jetzt wird der nächste Musiktitel geladen und steht zum Start über den Fader bereit.
Wichtig: Fader Bewegungen lösen Aktionen aus. Erst wenn der Kanalfader ausgeschaltet ist (mit Taste: „Chan.1 ON/OFF“ auf OFF), kann der Fader OHNE Start eines Musiktitels bewegt werden. Anschließend muss der Kanal wieder eingeschaltet werden (mit Taste: „Chan.1 ON/OFF“ auf ON).
Nachfolgend das Hintergrundscript:
// AKAI "APCmini": LED- und Programm-Steuerung *** Faderversion (only) ***
// Programming at: 26.02.2021
// Version: 3.03
// Autor: RBOR
// Quellen: mAirList Forum (als Anregung)
const // Zuordnung der Farben des AKAI "APCmini"-Controllers
off = 00;
green = 01;
green_blink = 02;
red = 03;
red_blink = 04;
yellow = 05;
yellow_blink = 06;
var
// Gobale Variablen fuer ALLE Prozeduren
Player01On, Player02On, Player03On: boolean;
Chan01On, Chan02On, Chan03On: boolean;
i: integer;
// Diese Prozedur wird beim START von mAirList ausgefuehrt
procedure OnLoad;
begin
MidiOutOpen(1);
Player01On := false; // Faderstart auf Player 01
Player02On := false; // Faderstart auf Player 02
Player03On := false; // Faderstart auf Player 03
Chan01On := false; // Kanal 01 eingeschaltet ?
Chan02On := false; // Kanal 02 eingeschaltet ?
Chan03On := false; // Kanal 03 eingeschaltet ?
end;
procedure OnMidiMessage(Device: integer; Status, Data1, Data2: byte);
// Eine Funktion ausloesen, wenn ein Fader benutzt wird
var
changed01, changed02, changed03: boolean;
isAboveThreshold01, isAboveThreshold02, isAboveThreshold03: boolean;
begin
// *** Is Music-Fader 01 moved? ***
// is the fader above the threshold value?
isAboveThreshold01 := Data2 >= $02;
// Fader for Player01 was moved
if (Status = $B0) and (Data1 = $30) then begin // Data1: Player01 Volumenregler
changed01 := Player01On <> isAboveThreshold01;
Player01On := isAboveThreshold01;
end;
// only mute/unmute if something has changed
if changed01 then begin
if Player01On then begin
// Player01 ON
// Nur ausfuehren, wenn Kanal 01 ON ist
if Chan01On then ExecuteCommand('PLAYER 1-1 START/STOP');
end;
if not Player01On then begin
if Chan01On then ExecuteCommand('PLAYER 1-1 STOP');
end;
end;
// *** Is Music-Fader 02 moved? ***
// is the fader above the threshold value?
isAboveThreshold02 := Data2 >= $02;
// Fader for Player02 was moved
if (Status = $B0) and (Data1 = $31) then begin // Data1: Player02 Volumenregler
changed02 := Player02On <> isAboveThreshold02;
Player02On := isAboveThreshold02;
end;
// only mute/unmute if something has changed
if changed02 then begin
if Player02On then begin
// Player02 ON
// Nur ausfuehren, wenn Kanal 02 ON ist
if Chan02On then ExecuteCommand('PLAYER 1-2 START/STOP');
end;
if not Player02On then begin
if Chan02On then ExecuteCommand('PLAYER 1-2 STOP');
end;
end;
// *** Is Music-Fader 03 moved? ***
// is the fader above the threshold value?
isAboveThreshold03 := Data2 >= $02;
// Fader for Player03 was moved
if (Status = $B0) and (Data1 = $32) then begin // Data1: Player03 Volumenregler
changed03 := Player03On <> isAboveThreshold03;
Player03On := isAboveThreshold03;
end;
// only mute/unmute if something has changed
if changed03 then begin
if Player03On then begin
// Player03 ON
// Nur ausfuehren, wenn Kanal 03 ON ist
if Chan03On then ExecuteCommand('PLAYER 1-3 START/STOP');
end;
if not Player03On then begin
if Chan03On then ExecuteCommand('PLAYER 1-3 STOP');
end;
end;
end;
procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex : integer; Item: IPlaylistItem);
begin
// Farbe fuer die Player-Tasten setzen
If PlayerIndex = 0 then begin
// Player A Steuertasten
MidiOut(1, $90, 00, yellow_blink); // device, status, data1, data2
MidiOut(1, $90, 64, red);
end;
If PlayerIndex = 1 then begin
// Player B Steuertasten
MidiOut(1, $90, 01, green_blink); // device, status, data1, data2
MidiOut(1, $90, 65, red);
end;
If PlayerIndex = 2 then begin
// Player C Steuertasten
MidiOut(1, $90, 02, red_blink); // device, status, data1, data2
MidiOut(1, $90, 66, red);
end;
end;
procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex : integer; Duration: TTimeValue; Item: IPlaylistItem);
begin
// Farbe fuer die Player-Tasten setzen
If PlayerIndex = 0 then begin
// Player A Steuertasten
MidiOut(1, $90, 00, yellow); // device, status, data1, data2
MidiOut(1, $90, 64, red);
end;
If PlayerIndex = 1 then begin
// Player B Steuertasten
MidiOut(1, $90, 01, green); // device, status, data1, data2
MidiOut(1, $90, 65, red);
end;
If PlayerIndex = 2 then begin
// Player C Steuertasten
MidiOut(1, $90, 02, red); // device, status, data1, data2
MidiOut(1, $90, 66, red);
end;
end;
// Verschiedene Commands auswerten und ausfuehren
procedure OnExecuteCommand(Command: string);
begin
if Command = 'ACTIVE01' then begin
if Chan01On then Chan01On := false else Chan01On := true;
if Chan01On then begin
MidiOut(1, $90, 00, yellow); // device, status, data1, data2
MidiOut(1, $90, 08, yellow); // device, status, data1, data2
MidiOut(1, $90, 64, red); // device, status, data1, data2
end;
if not Chan01On then begin
MidiOut(1, $90, 00, off); // device, status, data1, data2
MidiOut(1, $90, 08, off); // device, status, data1, data2
MidiOut(1, $90, 64, off); // device, status, data1, data2
end;
end;
if Command = 'ACTIVE01-1' then begin
if Chan01On then ExecuteCommand('PLAYER 1-1 START/FADEOUT');
end;
if Command = 'ACTIVE02' then begin
if Chan02On then Chan02On := false else Chan02On := true;
if Chan02On then begin
MidiOut(1, $90, 01, green); // device, status, data1, data2
MidiOut(1, $90, 09, green); // device, status, data1, data2
MidiOut(1, $90, 65, red); // device, status, data1, data2
end;
if not Chan02On then begin
MidiOut(1, $90, 01, off); // device, status, data1, data2
MidiOut(1, $90, 09, off); // device, status, data1, data2
MidiOut(1, $90, 65, off); // device, status, data1, data2
end;
end;
if Command = 'ACTIVE02-1' then begin
if Chan02On then ExecuteCommand('PLAYER 1-2 START/FADEOUT');
end;
if Command = 'ACTIVE03' then begin
if Chan03On then Chan03On := false else Chan03On := true;
if Chan03On then begin
MidiOut(1, $90, 02, red); // device, status, data1, data2
MidiOut(1, $90, 10, red); // device, status, data1, data2
MidiOut(1, $90, 66, red); // device, status, data1, data2
end;
if not Chan03On then begin
MidiOut(1, $90, 02, off); // device, status, data1, data2
MidiOut(1, $90, 10, off); // device, status, data1, data2
MidiOut(1, $90, 66, off); // device, status, data1, data2
end;
end;
if Command = 'ACTIVE03-1' then begin
if Chan03On then ExecuteCommand('PLAYER 1-3 START/FADEOUT');
end;
end;
// Diese Prozedur wird beim BEENDEN von mAirList ausgefuehrt
procedure OnUnLoad;
begin
// Grundfarben loeschen bei Programmende
// Grundfarbe: 00 (off) --> alle 99 Tasten AUS
for i:= 0 to 99 do MidiOut(1, $90, i, off); // device, status, data1, data2
MidiOutClose(1); // --> MIDI Device nur an dieser Stelle ZENTRAL schliessen
end;
// Main Program
begin
end.
Das obige Hintergrundscript ist sofort zum Test lauffähig, sofern keine eigenen Hintergrundscripte dieses verhindern.
Das Hintergrundscript kann auch auf andere MIDI-Controller übertragen werden, wenn die MIDI-Steuerbefehle entsprechen angepasst werden (s. Herstellerliste des MIDI-Controllers).
Getestet und programmiert wurde mit der mAirList Version: 6.3.7, Build: 4388
Gruß
rbor