#include "NoteScreenScale.h" #include "MidiEditorContext.h" NoteScreenScale::NoteScreenScale(MidiEditorContextPtr vp, float screenWidth, float screenHeight) : viewport(vp) { assert(screenWidth > 0); assert(screenHeight > 0); viewport->assertValid(); ax = screenWidth / (viewport->endTime() - viewport->startTime()); // min and max the same is fine - it's just one note bar full screen float dbg = ((viewport->pitchHi() + 1 / 12.f) - viewport->pitchLow()); ay = screenHeight / ((viewport->pitchHi() + 1 / 12.f) - viewport->pitchLow()); //printf("in init ax=%f ay=%f screenx=%f screeny=%f\n", ax, ay, screenWidth, screenHeight); //fflush(stdout); } float NoteScreenScale::midiTimeToX(const MidiEvent& ev) { return midiTimeToX(ev.startTime); } float NoteScreenScale::midiTimeToX(MidiEvent::time_t t) { return (t - viewport->startTime()) * ax; } float NoteScreenScale::midiTimeTodX(MidiEvent::time_t dt) { return dt * ax; } float NoteScreenScale::midiPitchToY(const MidiNoteEvent& note) { return (viewport->pitchHi() - note.pitchCV) * ay; } float NoteScreenScale::midiCvToY(float cv) { return (viewport->pitchHi() - cv) * ay; } float NoteScreenScale::noteHeight() { return (1 / 12.f) * ay; } std::pair NoteScreenScale::midiTimeToHBounds(const MidiNoteEvent& note) { float x = (note.startTime - viewport->startTime()) * ax; float y = (note.startTime + note.duration - viewport->startTime()) * ax; return std::pair(x, y); }