annotate hackday/MidiInputStream.cpp @ 24:5a11b19906c7

hackday code is added.
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Sat, 03 Dec 2011 17:19:43 +0000
parents
children 2a025ea7c793
rev   line source
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