midi device enerates tones according freedom rotation

Dependencies:   MMA8451Q USBDevice mbed TSI

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?

UserRevisionLine numberNew 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 }