MIDI-Controller „APCmini“, Vorstellung und Programmierung

Nein, der ist nicht regelbar.

2 Likes

Danke trotzdem. :raising_hand_man:

Hallo BSEplus,
über einen Umweg habe ich dann doch einen Regler (den ganz rechten) zum Steuern des Mikrofones realisieren können.
Mittlerweile ist der Controller stark mit vielen Funktionen belegt (suchen auf RBOR, dann "
[Layout & Skin] Zeigt hier eure Designs!" ganz am Ende ist der aktuelle Stand zu sehen.
Gruß
rbor

1 Like

Hallo rbor,
welche MIDI-Werte hast du denn für den Regler in der Fernsteuerung eingetragen?
Besten Dank und Gruß. :raising_hand_man:t3:

Hallo BSEplus,
am Wochenende beschreibe ich die Nutzung des Reglers für das Mikrofon. Ich bin im Moment noch unterwegs. Ein kleines Hintergrundscript löst das Problem (gefunden im Forum).
Gruß
rbor

1 Like

Hallo BSEplus,
wie Torben weiter oben schon gesagt hat, gibt es keinen Volumenregler für das Mikrofon.
Daher habe ich, für mich, die nachfolgende “Simulation” eines Mikrofonreglers realisiert:

  1. Änderung der “Absenkungs-Geschwindigkeit (ms)” für das Mikrofon (ON/OFF)
  2. Hintergrundscript, welches eine Bewegung des Reglers für das Mikrofon feststellt

Einstellung der “Absenkungs-Geschwindigkeit (ms)” von 200 ms (Standard) auf 800 ms und Einstellung "Player-Lautstärke automatisch absenken, wenn das Mikrofon aktiv ist" anklicken

image

Damit wird bei Ein- und Ausschalten des Mikrofon 800 ms vergehen, bis der “Absenkungs-Wert (dB)” auf -12 erreicht wird und umgekehrt.

Im nachfolgenden, kleinen Hintergrundscript (Quelle: mAirList Forum) wird die Auswertung einer Bewegung des ganz, rechten Schiebereglers realisiert:

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; 


procedure OnMidiMessage(Device: integer; Status, Data1, Data2: byte);
// Eine Funktion ausloesen, wenn ein Fader benutzt wird
var
  changed: boolean;
  isAboveThreshold: boolean;
begin
  changed := false;
  // is the fader above the threshold value?
  isAboveThreshold := Data2 >= $02;
  // Fader for mic1 was moved
  if (Status = $B0) and (Data1 = $38) then begin   
    // Data1: $38 = 56 dezimal --> ganz rechter Volumenregler
    changed := mic1on <> isAboveThreshold;
    mic1on := isAboveThreshold;
  end;
  // only mute/unmute if something has changed
  if changed then begin 
    MidiOutOpen(1);   // --> MIDI Device oeffnen
  if not mic1on then begin
    // Mic OFF
    ExecuteCommand('ENCODER INPUT MIC OFF');
    MidiOut(1, $90, 88, off); // device, status, data1, data2   
  end;
  if mic1on then begin
    // Mic ON
    ExecuteCommand('ENCODER INPUT MIC ON');
    MidiOut(1, $90, 88, green_blink); // device, status, data1, data2  
  end;
  MidiOutClose(1);   // --> MIDI Device schliessen
  end;
end;

Wird der ganz, rechte Schieberegler für das Mikrofon über eine eingestellten Schwellwert (Data2 >= $02) im Hintergrundscript bewegt, schaltet sich das Mikrofon an oder aus, je nach Bewegungsrichtung. 800 ms entspricht etwa der Zeit, in dem ich den Schieberegler ganz nach oben oder unten bewegt habe. Gleichzeitig erfolgt eine entsprechende LED-Steuerung (blinkend/statisch).

Auf dem Tastenlayout sieht das Ganze bei mir dann so aus:

image

Zusätzlich habe ich auch noch eine Taste für Mikrofon ON/OFF in der MIDI-Konfiguration hinterlegt:

Mit etwas Übung kann man mit dem Regler für das Mikrofon und obigen Einstellungen recht gut arbeiten. Das Mikrofon schaltet sich ein, wenn der Schieberegler über einen Schwellwert (Data2 >= $02) bewegt wird. Das gleiche passiert bei Betätigung des Tasters für das Mikrofon.

Gruss
rbor

2 Likes

Damit hast Du den Sinn eines Faders ad absurdum geführt, indem Du ihn als Schalter mißbrauchst.

2 Likes

Hallo rbor,
das sieht erstmal gut aus, vielen Dank! Da werde ich nachher mal probieren, wie ich das am besten auf meine Konfiguration anpasse. Wie du schreibst: mit ein wenig Übung wird das sicher praktikabel sein. Ich werde berichten!

Das stimmt einerseits, für den APCmini passt das aber ganz gut. Vielleicht hat Torben ja mal Zeit und Lust, die VOL Funktion auch beim Mikrofon zu integrieren.

Gleich vorneweg: Das Engagement in der Sache und, vor allem, das Teilen eures Wissens mit der Community finde ich 1a. Super, danke dafür! :+1:

Jetzt kommt dieses blöde “Aber”…

[reingrätsch]

Ich bin ja wirklich offen für neue Ideen und innovative Ansätze, aber momentan will sich mir der produktive Mehrwert dieser Sache nicht so recht erschließen.

Fakten:

  • mAirList ist eine professionelle Radioautomation, die sich bestens in nahezu jede Produktionsumgebung einfügt - auch dort, wo kein Mischpult am Start ist.

  • Wir haben die Hobbyszene nie aus dem Blick verloren und unterstützen sie weiterhin: Einerseits mit sensationell günstigen Preisen, andererseits mit einem stets offenen Ohr für Anregungen.
    Allein, es muss dann auch einen Mehrwert für die meisten Anwender haben und sich, zumindest überwiegend, verkaufen lassen, also ein gewichtiges Marketing-Argument darstellen.

Beim MIC-Button z.B. trifft das zu: Nicht nur ein großes Entgegenkommen an die Hobbyisten mit Minimal-Ausstattung wie z.B. Headsets oder USB-Mikrofonen, nein, sondern auch für das kleine Setup unterwegs oder für die Live-Berichterstattung vom Event oder Straßenfest bei zugleich unbesetztem Zentralstudio. Da kann unter Umständen schon der Pocketrecorder im Interface-Modus am Laptop für eine befriedigende (Vor-)Produktion reichen. Da hat wirklich jeder was davon.

Genau diesen übergreifenden Mehrwert, dieses “Au ja!” vermisse ich bei diesem (und ähnlichen) Midi-Controller(n).

Ich respektiere durchaus, dass es für dich / euch mehr als eben das Audio-Interface ist (nein, stop: Ich kann ja gar kein Mikrofon daran anschließen :thinking:), und als adäquater Ersatz statt eines Mischpults dienen könnte - aber ist es dann nicht mehr als eine bunt leuchtende, aufwändig zu programmierende Fernsteuerung?

Ganz ernsthaft: Was übersehe ich hier?
Worin liegt der USP, der Knaller, dieses “wow, mAirList kann auch das!”? In welcher Hinsicht hebt sich dieses Gerät (und andere dieser Art) aus der Gimmick-Klasse heraus?
Dabei ist das keineswegs abwertend gemeint, aber: Lohnt das den Programmieraufwand, wo wir ohnehin noch ganz andere Baustellen haben?

Und so ganz generell: In Sachen Fernsteuerung und Hardware wurden noch einige andere Dinge an uns herangetragen, die in der Warteschlange stehen.

Bitte helft mir doch mal, das Gerät und seine Produktivität in Verbindung mit mAirList richtig einzuordnen. Vielleicht habe ich den entscheidenden Punkt noch nicht erkannt.

1 Like

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