Jamoma API  0.6.0.a19
MIDIParserTo.cpp
Go to the documentation of this file.
1 /** @file
2  *
3  * @ingroup modularMIDI
4  *
5  * @brief edit bytes from /channel.N/command.M #TTAddress and a #TTValue
6  *
7  * @details it handles sysex @n
8  *
9  * @author Theo Delahogue
10  *
11  * @copyright © 2014, GMEA (http://www.gmea.net) @n
12  * This code is licensed under the terms of the "New BSD License" @n
13  * http://creativecommons.org/licenses/BSD/
14  */
15 
16 #include "MIDIParserTo.h"
17 
18 MIDIParserTo::MIDIParserTo() :
19 sysex(NO)
20 {
21  ;
22 }
23 
24 MIDIParserTo::~MIDIParserTo()
25 {
26  ;
27 }
28 
29 TTBoolean MIDIParserTo::parse(TTAddress& address, const TTValue& value)
30 {
31  // clear the parser (except in sysex case)
32  if (!sysex) {
33  statusByte = 0;
34  dataByte1 = 0;
35  dataByte2 = 0;
36  }
37  else {
38 
39  // TODO : encode the rest of the value into 3 bytes
40  }
41 
42  // parse command
43  TTSymbol command = address.getName();
44 
45  // handling sysex case first
46  if (command == TTSymbol("sysex")) {
47 
48  // TODO : encode the value into 3 bytes
49 
50  sysex = YES;
51 
52  // if there are still elements to encode
53  return NO;
54  }
55  else
56  sysex = NO;
57 
58  // parse command number
59  TTInt32 commandNumber = 0;
60  if (address.getInstance() != kTTSymEmpty) {
61 
62  TTValue v = TTString(address.getInstance().c_str());
63  v.fromString();
64  commandNumber = v[0];
65  }
66 
67  // parse channel
68  // TODO : catch the song/position and the song/select case
69  TTInt32 channel = 0;
70  if (address.getParent().getInstance() != kTTSymEmpty) {
71 
72  TTValue v = TTString(address.getParent().getInstance().c_str());
73  v.fromString();
74  channel = v[0];
75  }
76 
77  // depending on the command type, set statusByte, dataByte1 and dataByte2
78  if (command == TTSymbol("note")) {
79 
80  dataByte1 = commandNumber;
81  dataByte2 = value[0];
82 
83  if (dataByte2 == 0) {
84 
85  // NOTE OFF : statusByte = 128, dataByte1 = pitch, dataByte2 = velocity (always 0)
86  statusByte = 128;
87  }
88  else {
89 
90  // NOTE ON : statusByte = 144, dataByte1 = pitch, dataByte2 = velocity (always > 0)
91  statusByte = 144;
92  }
93  }
94  else if (command == TTSymbol("pressure")) {
95 
96  if (commandNumber) {
97 
98  // POLY PRESSURE : statusByte = 160, dataByte1 = pitch, dataByte2 = pressure
99  }
100  else {
101 
102  // CHANNEL PRESSURE : statusByte = 208, dataByte1 = pressure, dataByte2 not used
103  }
104  }
105  else if (command == TTSymbol("control")) {
106 
107  // CONTROL CHANGE : statusByte = 176, dataByte1 = control type, dataByte2 = control value
108  statusByte = 176;
109  dataByte1 = commandNumber;
110  dataByte2 = value[0];
111  }
112  else if (command == TTSymbol("program")) {
113 
114  // PROGRAM CHANGE : statusByte = 192, dataByte1 = program number, dataByte2 not used
115  statusByte = 192;
116  dataByte1 = commandNumber;
117  dataByte2 = 0;
118  }
119  else if (command == TTSymbol("wheel")) {
120 
121  // PITCH WHEEL : statusByte = 224, dataByte1 = LSB, dataByte2 = MSB
122  }
123  else if (command == TTSymbol("position")) { // ?? song/position
124 
125  // SONG POSITION : statusByte = 242, dataByte1 = LSB, dataByte2 = MSB
126  }
127  else if (command == TTSymbol("select")) { // ?? song/select
128 
129  // SONG SELECT : statusByte = 243, dataByte1 = song, dataByte2 not used
130  }
131  else if (command == TTSymbol("tune_request")) {
132 
133  // TUNE REQUEST : statusByte = 246, dataByte1 not used, dataByte2 not used
134  }
135  else if (command == TTSymbol("clock")) {
136 
137  // TIMING CLOCK : statusByte = 248, dataByte1 not used, dataByte2 not used
138  }
139  else if (command == TTSymbol("start")) {
140 
141  // START : statusByte = 250, dataByte1 not used, dataByte2 not used
142  }
143  else if (command == TTSymbol("continue")) {
144 
145  // CONTINUE : statusByte = 251, dataByte1 not used, dataByte2 not used
146  }
147  else if (command == TTSymbol("stop")) {
148 
149  // STOP : statusByte = 252, dataByte1 not used, dataByte2 not used
150  }
151  else if (command == TTSymbol("active_sensing")) {
152 
153  // ACTIVE SENSING : statusByte = 254, dataByte1 not used, dataByte2 not used
154  }
155  else if (command == TTSymbol("reset")) {
156 
157  // SYSTEM RESET : statusByte = 255, dataByte1 not used, dataByte2 not used
158  }
159 
160  // TODO ? catch /raw statusByte dataByte1 dataByte2
161  // TODO ? set timestamp
162 
163  return YES; // we only return NO in sysex case when the 3 bytes cannot store the value content
164 }
bool TTBoolean
Boolean flag, same as Boolean on the Mac.
Definition: TTBase.h:167
void fromString(TTBoolean numberAsSymbol=NO)
Convert a single string into individual elements using space to divide items.
Definition: TTValue.h:386
TTSymbol & getInstance()
Get the instance part.
Definition: TTAddress.h:124
TTAddress getParent()
Get a pointer to the parent address.
Definition: TTAddress.h:112
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Definition: TTAddress.h:29
The TTSymbol class is used to represent a string and efficiently pass and compare that string...
Definition: TTSymbol.h:26
const char * c_str() const
Return a pointer to the internal string as a C-string.
Definition: TTSymbol.h:77
std::int32_t TTInt32
32 bit signed integer
Definition: TTBase.h:177
edit bytes from /channel.N/command.M TTAddress and a TTValue
The TTString class is used to represent a string.
Definition: TTString.h:34
TTSymbol & getName()
Get the name part.
Definition: TTAddress.h:118
[doxygenAppendixC_copyExample]
Definition: TTValue.h:34