snazim sa trosku upgradnut apc aby sa dalo sucasne pouzit v standardnom mode scrollovania+spustania klipov a zaroven ako step sequencer. Cely koncept mam premysleny a step sekvencer v podstate poskladany v abletone, problem ale nastava s prekladom MIDI.
Ako si to predtavujem:
Stlacim button na APC (prepinac medzi normanlnym modom a mojim sekvencerom), cim poviem medzivrstve medzi nim a Abletonom, ze kazdy button z matice ma napr. posunut o 8 kanalov vyssie (kedze jednotlive stlpce tlacidiel su odosielane v kanaloch 1-8, pripocitanim 8 kanalov dostanem najjednoduchsiu novu sadu tlacidiel). To je vlastne cele a po dalsom stlaceni sa to prepne do povodneho modu.
Moje nefunkcne riesenie:
Mam medzi Ableton a APC strceny Processing a MIDI Yoke. V Proceesingu odchytavam z APC MIDI IN vsetky spravy a automaticky ich preposielam na MIDI Yoke OUT #2 a vsetky spravy z MIDI Yoke IN #1 preposielam na APC MIDI OUT (svetielka). V Abletone mam nastaveny ako control surface APC40, ako jeho vstupny kanal mam MIDI Yoke IN #2 a vystupny MIDI Yoke OUT #1. Toto samotne by malo iba premostit komunikaciu medzi Live a APC (hlavne tie ich sysexove handshaky aby sedeli), no z nejakeho dovodu mi to fungovalo asi 10 min a teraz ani bohovi. Pri starte Abletonu zisti, ze ma pripojene apc a vykresli cerveny ramik okolo 5 riadkov (scrollovaci pohlad) ale nereaguje dalej na nic...
Skusal som aj Bome's MIDI Translator, ale ten moze mat len 1 vstup / 1 vystup, co je dost naprd na obojsmernu komunikaciu. Puredata som nejak presvedcil na multi MIDI i/o ale vobec nic som z neho nedostal, resp. mi to hadzalo nejake divne errory ze nie je dost pamate.
Prosim o radu, akokolvek je mozne realizovat to co chcem, ak ste sa s niecim podobnym stretli... Ako idealny pripad sa mi zda ten Processing, akurat nechapem preco to nechce komunikovat
//EDIT: este som zabudol napisat, ze vlastne do Abletonu normalne prichadzaju noty aj CC cez tento moj "filter". Na druhej strane mi proces Live vzdy po vypnuti zostava visiet na pozadi a zere 50%CPU... Bude v tom nejaka kuleha skryta urcite...
//EDIT2: po zufalom skusani zapinania a vypinania to zrazu zacalo fungovat v smere apc > ableton...bo dalsom nahodnom vypinani zapinani to zacalo fungovat kompletne. Zacinam mat pocit ze chyba je bud v Processingovej kniznici RWMidi alebo virualnych kabloch MIDI Yoke (bezim na Win7). Vie niekto o lepsich ekvivalentoch?
Este zdrojak toho nefunkcneho mala co mam:
Kód: Vybrat vše
import rwmidi.*;
//vstup z apc
MidiInput apcIn = null;
//vstup z abletonu
MidiInput abletonIn = null;
//kam posielam spravy do apc
MidiOutput apcOut = null;
//kam posielam spravy abletonu
MidiOutput abletonOut = null;
//zistenie vstupov / vystupov
void setup() {
MidiInputDevice[] ins = RWMidi.getInputDevices();
for(int i=0; i<ins.length; i++) {
if(ins[i].toString().indexOf("APC40") >= 0) {
apcIn = ins[i].createInput();
for(int c=0; c<16; c++) {
apcIn.plug(new APCInputCallback(c), c);
}
println("APC In: " + ins[i].toString());
}
if(ins[i].toString().indexOf("Yoke") >= 0 && ins[i].toString().indexOf("1") >= 0) {
abletonIn = ins[i].createInput();
for(int c=0; c<16; c++) {
abletonIn.plug(new AbletonInputCallback(c), c);
}
println("Live In: " + ins[i].toString());
}
}
MidiOutputDevice[] outs = RWMidi.getOutputDevices();
for(int i=0; i<outs.length; i++) {
if(outs[i].toString().indexOf("APC40") >= 0) {
apcOut = outs[i].createOutput();
println("APC Out: " + outs[i].toString());
}
if(outs[i].toString().indexOf("Yoke") >= 0 && outs[i].toString().indexOf("2") >= 0) {
abletonOut = outs[i].createOutput();
println("Live Out: " + outs[i].toString());
}
}
}
//nic :)
void draw() {
}
// pocuvam vstup z apc a posielam ho do abletonu
public class APCInputCallback {
int channel = 0;
public APCInputCallback(int channel) {
this.channel = channel;
}
public void noteOnReceived(Note n) {
println("Channel: " + channel + " " + n);
abletonOut.sendNoteOn(channel, n.getPitch(), n.getVelocity());
}
public void noteOffReceived(Note n) {
println("Channel: " + channel + " " + n);
abletonOut.sendNoteOff(channel, n.getPitch(), n.getVelocity());
}
public void controllerChangeReceived(Controller c) {
println("Channel: " + channel + " " + c);
abletonOut.sendController(channel, c.getCC(), c.getValue());
}
public void programChangeReceived(ProgramChange p) {
println(p);
abletonOut.sendProgramChange(p.getNumber());
}
public void sysexReceived(SysexMessage s) {
println(s);
abletonOut.sendSysex(s.getMessage());
}
}
// pocuvam vstup a abletonu a posielam ho do apc
public class AbletonInputCallback {
int channel = 0;
public AbletonInputCallback(int channel) {
this.channel = channel;
}
public void noteOnReceived(Note n) {
println("Channel: " + channel + " " + n);
apcOut.sendNoteOn(channel, n.getPitch(), n.getVelocity());
}
public void noteOffReceived(Note n) {
println("Channel: " + channel + " " + n);
apcOut.sendNoteOff(channel, n.getPitch(), n.getVelocity());
}
public void controllerChangeReceived(Controller c) {
println("Channel: " + channel + " " + c);
apcOut.sendController(channel, c.getCC(), c.getValue());
}
public void programChangeReceived(ProgramChange p) {
println(p);
apcOut.sendProgramChange(p.getNumber());
}
public void sysexReceived(SysexMessage s) {
println(s);
apcOut.sendSysex(s.getMessage());
}
}