1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
MIDIState{
var <name, <>uid, <>inPortNum, <>outPortNum, <>verbose, <data, <banks,
<currentBank, <>connected=false;
*new{
arg name, uid, inPortNum, outPortNum, verbose;
^super.newCopyArgs(
name,
uid,
inPortNum,
outPortNum,
verbose
).initState();
}
initState{
data = Dictionary();
banks = Dictionary();
currentBank = 0;
connected = true;
}
update{
arg name, type, value, chan, msgNum;
if(verbose,{
postln(name++": ["++name.asString++", "++chan.asString++
", "++type.asString++", " ++value.asString++"]");
});
// TODO: check whether event is a bankUp/bankDown event
data.add(name -> MIDIStateEvent.new(type.asString, value, chan, msgNum));
// if a bank-able event is changed
if("(channel|fader|button|poti)[1-9]".matchRegexp(name.asString),{
// create current bank, if not available yet
if(banks.at(currentBank).isKindOf(Dictionary).not,{
banks.add(currentBank -> Dictionary.new());
});
banks.at(currentBank).add(name -> MIDIStateEvent.new(type.asString,
value, chan, msgNum));
});
}
postData{
data.keysValuesDo({|name,event|
post(name++" -> ");
event.postln;
});
}
postBanks{
banks.keysValuesDo({|number,bank|
postln("Bank "++number++":");
bank.keysValuesDo({|name,event|
post(name++" -> ");
event.postln;
});
});
}
// set takeOver to true for all available MIDIStateEvents
takeOver{
[banks, data].do({|dict|
dict.valuesDo({|event|
event.takeOver=true;
});
});
}
}
|