midi device enerates tones according freedom rotation
Dependencies: MMA8451Q USBDevice mbed TSI
main.cpp@4:9c81faf1b372, 2013-08-19 (annotated)
- Committer:
- PavelM
- Date:
- Mon Aug 19 12:16:44 2013 +0000
- Revision:
- 4:9c81faf1b372
- Parent:
- 3:e0684e01fca1
- Child:
- 5:421d532c6403
added Pitch and time delay functionality - note change on Y axe, pitch axe X, delay is slider.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
PavelM | 0:8e6b0e518883 | 1 | #include "mbed.h" |
PavelM | 1:970adc6aae96 | 2 | #include "MMA8451Q.h" |
PavelM | 1:970adc6aae96 | 3 | #include "USBMIDI.h" |
PavelM | 4:9c81faf1b372 | 4 | #include "TSISensor.h" |
PavelM | 1:970adc6aae96 | 5 | |
PavelM | 1:970adc6aae96 | 6 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
PavelM | 0:8e6b0e518883 | 7 | |
PavelM | 1:970adc6aae96 | 8 | #define C1 0 |
PavelM | 1:970adc6aae96 | 9 | #define D1 0.125 |
PavelM | 1:970adc6aae96 | 10 | #define E1 0.250 |
PavelM | 1:970adc6aae96 | 11 | #define F1 0.375 |
PavelM | 1:970adc6aae96 | 12 | #define G1 0.5 |
PavelM | 1:970adc6aae96 | 13 | #define A1 0.625 |
PavelM | 1:970adc6aae96 | 14 | #define H1 0.750 |
PavelM | 1:970adc6aae96 | 15 | #define C2 0.875 |
PavelM | 1:970adc6aae96 | 16 | #define D2 1 |
PavelM | 1:970adc6aae96 | 17 | #define E2 1.125 |
PavelM | 1:970adc6aae96 | 18 | #define F2 1.250 |
PavelM | 1:970adc6aae96 | 19 | #define G2 1.375 |
PavelM | 1:970adc6aae96 | 20 | #define A2 1.5 |
PavelM | 1:970adc6aae96 | 21 | #define H2 1.625 |
PavelM | 1:970adc6aae96 | 22 | #define C3 1.750 |
PavelM | 1:970adc6aae96 | 23 | |
stefanimrich | 2:c79be10b5ff3 | 24 | #define NC1 48 |
stefanimrich | 2:c79be10b5ff3 | 25 | #define ND1 50 |
stefanimrich | 2:c79be10b5ff3 | 26 | #define NE1 52 |
stefanimrich | 2:c79be10b5ff3 | 27 | #define NF1 53 |
stefanimrich | 2:c79be10b5ff3 | 28 | #define NG1 55 |
stefanimrich | 2:c79be10b5ff3 | 29 | #define NA1 57 |
stefanimrich | 2:c79be10b5ff3 | 30 | #define NH1 59 |
stefanimrich | 2:c79be10b5ff3 | 31 | #define NC2 60 |
stefanimrich | 2:c79be10b5ff3 | 32 | #define ND2 62 |
stefanimrich | 2:c79be10b5ff3 | 33 | #define NE2 64 |
stefanimrich | 2:c79be10b5ff3 | 34 | #define NF2 65 |
stefanimrich | 2:c79be10b5ff3 | 35 | #define NG2 67 |
stefanimrich | 2:c79be10b5ff3 | 36 | #define NA2 69 |
stefanimrich | 2:c79be10b5ff3 | 37 | #define NH2 71 |
stefanimrich | 2:c79be10b5ff3 | 38 | #define NC3 72 |
PavelM | 0:8e6b0e518883 | 39 | |
PavelM | 4:9c81faf1b372 | 40 | /* tempo delays */ |
PavelM | 4:9c81faf1b372 | 41 | #define EITH 5 |
PavelM | 4:9c81faf1b372 | 42 | #define QUATER 25 |
PavelM | 4:9c81faf1b372 | 43 | #define HALF 50 |
PavelM | 4:9c81faf1b372 | 44 | #define FULL 75 |
PavelM | 4:9c81faf1b372 | 45 | |
PavelM | 4:9c81faf1b372 | 46 | #define T_EITH 0.08 /* set the basic dealy here */ |
PavelM | 4:9c81faf1b372 | 47 | #define T_QUATER (T_EITH*2) |
PavelM | 4:9c81faf1b372 | 48 | #define T_HALF (T_QUATER*2) |
PavelM | 4:9c81faf1b372 | 49 | #define T_FULL (T_HALF*2) |
PavelM | 4:9c81faf1b372 | 50 | |
PavelM | 1:970adc6aae96 | 51 | Serial pc(USBTX,USBRX); |
PavelM | 1:970adc6aae96 | 52 | USBMIDI midi; |
PavelM | 4:9c81faf1b372 | 53 | TSISensor tsi; |
stefanimrich | 3:e0684e01fca1 | 54 | |
PavelM | 1:970adc6aae96 | 55 | |
PavelM | 1:970adc6aae96 | 56 | void show_message(MIDIMessage msg) { |
PavelM | 1:970adc6aae96 | 57 | switch (msg.type()) { |
PavelM | 1:970adc6aae96 | 58 | case MIDIMessage::NoteOnType: |
PavelM | 1:970adc6aae96 | 59 | printf("NoteOn key:%d, velocity: %d, channel: %d\n", msg.key(), msg.velocity(), msg.channel()); |
PavelM | 1:970adc6aae96 | 60 | break; |
PavelM | 1:970adc6aae96 | 61 | case MIDIMessage::NoteOffType: |
PavelM | 1:970adc6aae96 | 62 | printf("NoteOff key:%d, velocity: %d, channel: %d\n", msg.key(), msg.velocity(), msg.channel()); |
PavelM | 1:970adc6aae96 | 63 | break; |
PavelM | 1:970adc6aae96 | 64 | case MIDIMessage::ControlChangeType: |
PavelM | 1:970adc6aae96 | 65 | printf("ControlChange controller: %d, data: %d\n", msg.controller(), msg.value()); |
PavelM | 1:970adc6aae96 | 66 | break; |
PavelM | 1:970adc6aae96 | 67 | case MIDIMessage::PitchWheelType: |
PavelM | 1:970adc6aae96 | 68 | printf("PitchWheel channel: %d, pitch: %d\n", msg.channel(), msg.pitch()); |
PavelM | 1:970adc6aae96 | 69 | break; |
PavelM | 1:970adc6aae96 | 70 | default: |
PavelM | 1:970adc6aae96 | 71 | printf("Another message\n"); |
PavelM | 1:970adc6aae96 | 72 | } |
PavelM | 1:970adc6aae96 | 73 | } |
PavelM | 1:970adc6aae96 | 74 | |
PavelM | 1:970adc6aae96 | 75 | |
PavelM | 1:970adc6aae96 | 76 | |
PavelM | 1:970adc6aae96 | 77 | int main() { |
PavelM | 1:970adc6aae96 | 78 | |
PavelM | 1:970adc6aae96 | 79 | int note=48; |
PavelM | 1:970adc6aae96 | 80 | float notechng; |
PavelM | 4:9c81faf1b372 | 81 | float fpitch; |
PavelM | 4:9c81faf1b372 | 82 | int tempo; |
PavelM | 4:9c81faf1b372 | 83 | float pause = T_HALF; |
PavelM | 1:970adc6aae96 | 84 | |
PavelM | 1:970adc6aae96 | 85 | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); |
PavelM | 1:970adc6aae96 | 86 | |
PavelM | 1:970adc6aae96 | 87 | midi.attach(show_message); // call back for messages received |
PavelM | 4:9c81faf1b372 | 88 | |
PavelM | 1:970adc6aae96 | 89 | while (1) { |
PavelM | 4:9c81faf1b372 | 90 | #if 0 |
PavelM | 4:9c81faf1b372 | 91 | /* test pitch - commented in in - endif*/ |
PavelM | 4:9c81faf1b372 | 92 | midi.write(MIDIMessage::NoteOn(57)); |
PavelM | 4:9c81faf1b372 | 93 | for(int c=-8000; c<8000; c= c+100){ |
PavelM | 4:9c81faf1b372 | 94 | |
PavelM | 4:9c81faf1b372 | 95 | midi.write(MIDIMessage::PitchWheel(c)); |
PavelM | 4:9c81faf1b372 | 96 | pc.printf("Pitch: %d \n", c); |
PavelM | 4:9c81faf1b372 | 97 | } |
PavelM | 4:9c81faf1b372 | 98 | midi.write(MIDIMessage::NoteOff(57)); |
PavelM | 4:9c81faf1b372 | 99 | wait(0.5); |
PavelM | 4:9c81faf1b372 | 100 | #endif |
PavelM | 4:9c81faf1b372 | 101 | |
PavelM | 4:9c81faf1b372 | 102 | /* read note */ |
PavelM | 1:970adc6aae96 | 103 | notechng = 1 - acc.getAccX(); |
PavelM | 4:9c81faf1b372 | 104 | /* get pitch */ |
PavelM | 4:9c81faf1b372 | 105 | fpitch = acc.getAccY()*100; |
PavelM | 4:9c81faf1b372 | 106 | |
PavelM | 4:9c81faf1b372 | 107 | /* get tempo */ |
PavelM | 4:9c81faf1b372 | 108 | tempo =int(tsi.readPercentage() * 100); |
PavelM | 4:9c81faf1b372 | 109 | |
PavelM | 4:9c81faf1b372 | 110 | pause = T_EITH; |
PavelM | 4:9c81faf1b372 | 111 | if(tempo > QUATER) pause = T_QUATER; |
PavelM | 4:9c81faf1b372 | 112 | if(tempo > HALF) pause = T_HALF; |
PavelM | 4:9c81faf1b372 | 113 | if(tempo > FULL) pause = T_FULL; |
PavelM | 4:9c81faf1b372 | 114 | |
PavelM | 4:9c81faf1b372 | 115 | pc.printf("pause: %f, note: %f, pitch: %d \n",pause, note, (int)fpitch*100); |
PavelM | 0:8e6b0e518883 | 116 | |
PavelM | 1:970adc6aae96 | 117 | midi.write(MIDIMessage::NoteOff(note)); |
PavelM | 4:9c81faf1b372 | 118 | wait(pause); |
PavelM | 0:8e6b0e518883 | 119 | |
PavelM | 1:970adc6aae96 | 120 | if(notechng > C1) note= NC1; |
PavelM | 1:970adc6aae96 | 121 | if(notechng > D1) note= ND1; |
PavelM | 1:970adc6aae96 | 122 | if(notechng > E1) note= NE1; |
PavelM | 1:970adc6aae96 | 123 | if(notechng > F1) note= NF1; |
PavelM | 1:970adc6aae96 | 124 | if(notechng > G1) note= NG1; |
PavelM | 1:970adc6aae96 | 125 | if(notechng > A1) note= NA1; |
PavelM | 1:970adc6aae96 | 126 | if(notechng > H1) note= NH1; |
PavelM | 1:970adc6aae96 | 127 | if(notechng > C2) note= NC2; |
PavelM | 1:970adc6aae96 | 128 | if(notechng > D2) note= ND2; |
PavelM | 1:970adc6aae96 | 129 | if(notechng > E2) note= NE2; |
PavelM | 1:970adc6aae96 | 130 | if(notechng > F2) note= NF2; |
PavelM | 1:970adc6aae96 | 131 | if(notechng > G2) note= NG2; |
PavelM | 1:970adc6aae96 | 132 | if(notechng > A2) note= NA2; |
PavelM | 1:970adc6aae96 | 133 | if(notechng > H2) note= NH2; |
PavelM | 1:970adc6aae96 | 134 | if(notechng > C3) note= NC3; |
PavelM | 1:970adc6aae96 | 135 | |
PavelM | 1:970adc6aae96 | 136 | midi.write(MIDIMessage::NoteOn(note)); |
PavelM | 4:9c81faf1b372 | 137 | midi.write(MIDIMessage::PitchWheel(int(fpitch))); |
PavelM | 4:9c81faf1b372 | 138 | |
PavelM | 4:9c81faf1b372 | 139 | wait(pause); |
PavelM | 1:970adc6aae96 | 140 | |
PavelM | 0:8e6b0e518883 | 141 | } |
PavelM | 1:970adc6aae96 | 142 | } |