summaryrefslogtreecommitdiffstats
path: root/classes/MIDIState.sc
blob: 40c4b0f639bc6717188604b38f67c9d37c2c67b8 (plain)
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;
      });
    });
  }

}