andrew@24: /* andrew@24: * MidiInputStream.cpp andrew@24: * MuseScoreMidiFollower andrew@24: * andrew@24: * Created by Andrew on 03/12/2011. andrew@24: * Copyright 2011 QMUL. All rights reserved. andrew@24: * andrew@24: */ andrew@24: andrew@24: #include "MidiInputStream.h" andrew@24: andrew@24: andrew@24: MidiInputStream::MidiInputStream(){ andrew@24: reset(); andrew@24: } andrew@24: andrew@24: andrew@24: void MidiInputStream::reset(){ andrew@26: andrew@24: midiInputEvents.clear(); andrew@26: midiInputTimes.clear(); andrew@26: andrew@24: eventTimesForNote.clear(); andrew@24: eventTimesForNote.assign (127, 0.0); andrew@26: andrew@26: andrew@26: totalNotesRecievedByPitch.clear(); andrew@26: totalNotesRecievedByPitch.assign (127, 0); andrew@26: andrew@24: } andrew@24: andrew@24: bool MidiInputStream::noteInReceived(ofxMidiEventArgs &args){ andrew@24: // 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: bool noteOn = false; andrew@24: int newPitch; andrew@24: switch (args.status) { andrew@24: andrew@24: case 144: andrew@24: newPitch = (int)args.byteOne; andrew@24: newPitch += (*transposeVal); andrew@24: andrew@25: // printf("note on %i", args.byteOne); andrew@24: if (args.byteTwo){ andrew@25: // printf("volume is %i\n", args.byteTwo); andrew@24: double time = ofGetElapsedTimeMillis(); andrew@24: eventTimesForNote[newPitch] = time; andrew@24: noteOn = true; andrew@26: newNoteCounted(newPitch); andrew@24: andrew@24: }else{ andrew@24: double time = ofGetElapsedTimeMillis(); andrew@24: time -= eventTimesForNote[newPitch]; andrew@26: // printf(", NOTE OFF after %f millis %f ticks\n", time, time * (*factor)); andrew@24: andrew@24: int index = endNote(newPitch); andrew@25: //correct the length of note time andrew@25: if (midiInputEvents[index].size() > 2) andrew@25: midiInputEvents[index][3] = (time * (*factor)); andrew@24: } andrew@24: andrew@24: break; andrew@24: default: andrew@24: break; andrew@24: } andrew@24: andrew@24: return noteOn; andrew@24: //cout << "MIDI message [port: " << args.port << ", channel: " << args.channel << ", status: " << args.status << ", byteOne: " << newPitch << ", byteTwo: " << args.byteTwo << ", timestamp: " << args.timestamp << "]" << endl; andrew@24: } andrew@24: andrew@26: void MidiInputStream::newNoteCounted(const int& pitch){ andrew@26: totalNotesRecievedByPitch[pitch] += 1; andrew@26: } andrew@24: andrew@24: int MidiInputStream::endNote(int notePitch){ andrew@24: int index = midiInputEvents.size()-1; andrew@24: while (index > 0 && midiInputEvents[index][1] != notePitch){ andrew@24: index--; andrew@24: } andrew@25: // printf("found index %i\n", index); andrew@24: return index; andrew@24: } andrew@24: andrew@26: double MidiInputStream::calculateTotalScore(midiEventHolder& midiEvents){ andrew@26: double gameScore = 1.0; andrew@26: double totalNotes = 1.0; andrew@26: if (totalNotesRecievedByPitch.size() > 100){ andrew@26: for (int i = 30;i < 90;i++){ andrew@26: gameScore += abs(totalNotesRecievedByPitch[i] - midiEvents.recordedTotalNoteCounterByPitch[i]); andrew@26: totalNotes += midiEvents.recordedTotalNoteCounterByPitch[i]; andrew@26: } andrew@26: } andrew@26: return 1.0 - (gameScore / totalNotes); andrew@26: andrew@26: } andrew@26: andrew@24: void MidiInputStream::printNotes(){ andrew@24: printf("live input \n"); andrew@24: for (int i = 0;i < midiInputEvents.size();i++){ andrew@24: printf("ticktime %i :: pitch %i @ millis %f\n", midiInputEvents[i][0], midiInputEvents[i][1], midiInputTimes[i]); andrew@24: } andrew@24: } andrew@26: andrew@26: void MidiInputStream::printTotalCount(){ andrew@26: for (int i = 0;i < totalNotesRecievedByPitch.size();i++){ andrew@26: printf("LIVE PLAYED TOTAL[%i] := %i\n", i, totalNotesRecievedByPitch[i]); andrew@26: } andrew@26: } andrew@24: