andrew@24
|
1 /*
|
andrew@24
|
2 * MidiInputStream.cpp
|
andrew@24
|
3 * MuseScoreMidiFollower
|
andrew@24
|
4 *
|
andrew@24
|
5 * Created by Andrew on 03/12/2011.
|
andrew@24
|
6 * Copyright 2011 QMUL. All rights reserved.
|
andrew@24
|
7 *
|
andrew@24
|
8 */
|
andrew@24
|
9
|
andrew@24
|
10 #include "MidiInputStream.h"
|
andrew@24
|
11
|
andrew@24
|
12
|
andrew@24
|
13 MidiInputStream::MidiInputStream(){
|
andrew@24
|
14 reset();
|
andrew@24
|
15 }
|
andrew@24
|
16
|
andrew@24
|
17
|
andrew@24
|
18 void MidiInputStream::reset(){
|
andrew@24
|
19 midiInputEvents.clear();
|
andrew@24
|
20 eventTimesForNote.clear();
|
andrew@24
|
21 eventTimesForNote.assign (127, 0.0);
|
andrew@24
|
22 midiInputTimes.clear();
|
andrew@24
|
23 }
|
andrew@24
|
24
|
andrew@24
|
25 bool MidiInputStream::noteInReceived(ofxMidiEventArgs &args){
|
andrew@24
|
26 // printf("midi input received port %i, channel %i status %i, byteOne %i, byteTwo %i\n", args.port,args.channel, args.status, newPitch, args.byteTwo);
|
andrew@24
|
27 bool noteOn = false;
|
andrew@24
|
28 int newPitch;
|
andrew@24
|
29 switch (args.status) {
|
andrew@24
|
30
|
andrew@24
|
31 case 144:
|
andrew@24
|
32 newPitch = (int)args.byteOne;
|
andrew@24
|
33 newPitch += (*transposeVal);
|
andrew@24
|
34
|
andrew@24
|
35 printf("note on %i", args.byteOne);
|
andrew@24
|
36 if (args.byteTwo){
|
andrew@24
|
37 printf("volume is %i\n", args.byteTwo);
|
andrew@24
|
38 double time = ofGetElapsedTimeMillis();
|
andrew@24
|
39 eventTimesForNote[newPitch] = time;
|
andrew@24
|
40
|
andrew@24
|
41 noteOn = true;
|
andrew@24
|
42
|
andrew@24
|
43 }else{
|
andrew@24
|
44 double time = ofGetElapsedTimeMillis();
|
andrew@24
|
45 time -= eventTimesForNote[newPitch];
|
andrew@24
|
46 printf(", OFF after %f millis %f ticks\n", time, time * (*factor));
|
andrew@24
|
47
|
andrew@24
|
48 int index = endNote(newPitch);
|
andrew@24
|
49 midiInputEvents[index].push_back(time * (*factor));
|
andrew@24
|
50 }
|
andrew@24
|
51
|
andrew@24
|
52 break;
|
andrew@24
|
53 default:
|
andrew@24
|
54 break;
|
andrew@24
|
55 }
|
andrew@24
|
56
|
andrew@24
|
57 return noteOn;
|
andrew@24
|
58 //cout << "MIDI message [port: " << args.port << ", channel: " << args.channel << ", status: " << args.status << ", byteOne: " << newPitch << ", byteTwo: " << args.byteTwo << ", timestamp: " << args.timestamp << "]" << endl;
|
andrew@24
|
59 }
|
andrew@24
|
60
|
andrew@24
|
61
|
andrew@24
|
62 int MidiInputStream::endNote(int notePitch){
|
andrew@24
|
63 int index = midiInputEvents.size()-1;
|
andrew@24
|
64 while (index > 0 && midiInputEvents[index][1] != notePitch){
|
andrew@24
|
65 index--;
|
andrew@24
|
66 }
|
andrew@24
|
67 printf("found index %i\n", index);
|
andrew@24
|
68 return index;
|
andrew@24
|
69 }
|
andrew@24
|
70
|
andrew@24
|
71 void MidiInputStream::printNotes(){
|
andrew@24
|
72 printf("live input \n");
|
andrew@24
|
73 for (int i = 0;i < midiInputEvents.size();i++){
|
andrew@24
|
74 printf("ticktime %i :: pitch %i @ millis %f\n", midiInputEvents[i][0], midiInputEvents[i][1], midiInputTimes[i]);
|
andrew@24
|
75 }
|
andrew@24
|
76 }
|
andrew@24
|
77
|