MIDI-Controller „APCmini“, Vorstellung und Programmierung

Hallo rbor,
es hat eine Weile gedauert, bis ich das Script mal einbauen und testen konnte. Ich habe ein separates Hintergrundscript gemacht und deinen Code eingebaut.
Folgender Fehler wird ausgeworfen:

20.02.2021 14:52:31 Fehler Fehler beim Laden des Hintergrund-Scripts D:\OneDrive\Musik\mAirList BSEplus\Fader_for_mic.mls: [Error] (25:16): Unknown identifier ‘mic1on’

Kann oder muss ich den identifier ‘mic1on’ noch irgendwo vereinbaren? Der Regler reagiert so leider gar nicht.
Eilt aber nicht. Besten Dank.
Gruß BSEplus

Dass das APCmini kein Mischpult ist und auch keins davon adäquat ersetzen kann, ist mir sehr bewusst. Es hat für mich den Mehrwert, dass ich größtenteils ohne Maus mein Setup bedienen kann: Player starten und stoppen, ausblenden, Automation ein und aus und next, Mikrofon an und aus, Cartwall abfeuern. Über die Fader kann ich aktuell die Lautstärke der Player regeln und auch der Cartwall.
Mehr wollte ich nicht und dafür passt es ganz gut.
Also so ist meine Erfahrung.

Hallo BSEplus,
stimmt, die Variable mic1on muss global einmal definiert werden, also z. Bsp. hinter der Definition der Konstanten im obigen Script:

var
  mic1on: boolean; 

In der Prozedur “OnLoad” sollte ein Anfangswert gesetzt werden:

Procedure OnLoad;
begin
  mic1on := false;
end;

Jetzt sollte es klappen.
Gruss
rbor

1 Like

Hallo rbor,
nach der Sendung heute habe ich es implementiert und siehe da - es läuft! Ganz großes Kino.
Jetzt geht die Arbeit mit dem kleinen Teil noch besser von der Hand. Danke nochmal!
Jetzt bastele ich mir noch die Taste Nr. 07 blinkend und dann bin ich zufrieden.
Viele Grüße
BSEplus

Hallo BSEplus,
freut mich zu hören. Bin gerade dabei meine 3 Player bei mir mit Faderstart programmtechnisch auszurüsten. Klappt schon prima. Der entsprechende Player startet automatisch, wenn ich den Fader hoch ziehe. Ziehe ich den Fader wieder ganz runter, wird das nächste Musikstück geladen. Bin noch im Test. Melde mich demnächst wieder.
Grus
rbor

1 Like

Hi rbor,
das ist ja Wahnsinn, was du aus dem kleinen Stück MIDI-Hardware so rausholst bzw. noch rausholen willst. Ich bin sehr offen für diese Basteleien! Die Investition in den AKAI muss sich ja lohnen.
Freue mich drauf!
Viele Grüße
BSEplus

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.

image
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:
image
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):

image

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

1 Like

Hi rbor,
super Idee tolle Arbeit. Ich wollte wissen ob das auch mit dem Akai MPD 232 funktionieren würde mit der Belegung wie du sie hast. Ich habe Probleme mit den Augen und bräuchte größere PADs das Software-Paket bei diesem Model weniger ist. Das mit den kurzen Fader von 45mm müßte ich halt ausprobieren. Am liebsten wäre mir das Behringer x-touch Compact wegen den langen Fadern allerdings weis ich nicht ob es mit deiner Zuweisung klappen könnte.

Gruß carleto

Hallo @carleto,

bist du bitte so nett und trägst noch deine Lizenznummer in das Forenprofil ein? Es ist nicht öffentlich und kann nur vom mAirList Team eingesehen werden.
Dann können wir dich in die Gruppe der “verified customer” aufnehmen.

Vielen Dank.

Hallo Carleto,
vielen Dank für Deine Rückmeldung. Ich sehe daran, dass die Informationen doch für den einen oder anderen interessant sein könnten.
Zur Deiner Frage: im Prinzip kann jeder MIDI-Controller, der 3 Fader und mindestens 2 Taster je Kanal zur Verfügung stellt, verwendet werden.
Wie weiter oben beschrieben, müssen die MDI-Befehle an den entsprechenden MIDI-Controller angepasst werden. Die Schwierigkeit ist manchmal, diese MIDI-Befehlsliste von den Hersteller zu bekommen.
Das Format für die MIDI-Befehle zur Anpassung habe ich weiter oben beschrieben.
Viel Erfolg.
Gruss
rbor

Hinweis: natürlich geht es auch mit 1 oder auch 4 Fadern, je nachdem was zur Verfügung steht.
Gruss
rbor

Lokale Monitoring Lautsprecher AUS, wenn Mic-Regler hochgezogen wird und umgekehrt

Funktion: wenn der MIC-Regler hochgezogen wird (auf 100% Volumen), sollen die lokalen Monitor-Lautsprecher sich ausschalten, und umgekehrt, wenn der MIC-Regler ganz nach unten (0% Volumen) gezogen wird, sollen sich die lokalen Monitor-Lautsprecher wieder einschalten. So wird wirkungsvoll eine Rückkopplung zwischen Mikrofon und den Monitor-Lautsprechern vermieden.
Das Programm bezieht sich auf den ganz, rechts unten vorhandenen Volumen-Regler.

Nachfolgendes Hintergrundscript wurde um die Funktionen (ExecuteCommand(‘ENCODER LOCALOUTPUT OFF’)) und (ExecuteCommand(‘ENCODER LOCALOUTPUT ON’)) ergänzt:

// Autor:     RBOR
// Quellen:   mAirList Forum (als Anregung)
 
var
  mic1on: boolean; 

procedure OnLoad;  
begin
  mic1on := false;  // Mikrofon1-Flag
end;

procedure OnMidiMessage(Device: integer; Status, Data1, Data2: byte);
// Eine Funktion ausloesen, wenn ein Fader benutzt wird
var
  changed, isAboveThreshold: boolean;

begin
  // *** Wurde der "Mic-Fader" bewegt? ***
  changed := false;
  // Ist der Fader über dem "threshold"-Wert?
  isAboveThreshold := Data2 >= $02;
  // Der Fader fuer mic1 wurde bewegt
  if (Status = $B0) and (Data1 = $38) then begin   
    // Data1: $38 = 56 dezimal --> ganz rechter Volumenregler
    changed := mic1on <> isAboveThreshold;
    mic1on := isAboveThreshold;
  end;
  // Nur auf "mute/unmute" setzen, wenn sich was veraendert hat
  if changed then begin 
    if not mic1on then begin
      // Mic OFF
      ExecuteCommand('ENCODER LOCALOUTPUT ON');   // lokale Lautsprecher ON
      ExecuteCommand('ENCODER INPUT MIC OFF');
    end;
    if mic1on then begin
      // Mic ON
      ExecuteCommand('ENCODER LOCALOUTPUT OFF');   // lokale Lautsprecher OFF
      ExecuteCommand('ENCODER INPUT MIC ON');
    end;
  end;
end;

// Main Program
begin
  
end.

Obiges Programm ist zum Test sofort lauffähig.
Die Einstellungen für den ENCODER unter OPTIONEN sehen bei mir so aus:

image

Die “Absenkungs-Geschwindigkeit” wurde bei mir von 200 (ms) auf 800 (ms) eingestellt, damit ein langsames Ein- und Ausblenden des Mikrofons gewährleistet wird.
Getestet wurde mit Version: 6.3.7, Build: 4388.

Gruss
rbor

Korrektur
Gemeint ist die Geschwindigkeit der Absenkung der laufenden Musik.
Gruss
rbor

Siehe dazu die ausührliche Erläuterung in Beitrag #17.

Hallo zusammen, aktuell setze ich genau dass um, wie @rbor das hier beschrieben hat. Auch mit der aktuellsten Version von Mairlist und der Apcmini MKII ist das so umsetzbar. Ich bin begeistert. Vielen Dank für die Zeit und Mühe die investiert wurde.

Hallo Der2L,
super, dass die obigen Programme auch in der mAirList Version 7 und dem Nachfolger APCmini MKII laufen. Bisher konnte ich diese Versionen noch nicht testen.
Ich (RBOR) bin Hobby Programmierer und programmiere in FREE PASCAL unter der Entwicklungsumgebung LAZARUS (wo auch Delphi zu finden ist).

Ein Eindruck meiner wichtigsten Programme:

Viele Funktionen sind auch über ein großes Hintergrundscript für den APCmini über Tasten implementiert.

Gruss
RBOR

Schön! Wozu braucht man das?

Was fährst du mit dem 3. Player? Die Cartwall?

Ich nutze die Player 1-3 (A-C) als normale Musikplayer. Die Cartwall regle ich nicht, sondern lasse die Lautstärke so wie sie in mAirList eingestellt ist.

Nur als Idee:
Ich lege die Cart 1 immer gerne auf einen seperaten Fader damit ich so ein Musikbett (das auch mal im Dauer-Loop läuft) per Hand in der Lautstärke regeln kann. :wink:

1 Like