/* * Filename: Message.h * * Description: * * * Version: * Created: Tue Mar 10 23:06:17 2020 * Revision: None * Author: Rachel Fae Fox (foxiepaws),fox@foxiepa.ws * */ #include #include "midi/message.h" namespace amalgam { namespace Utils { template T clamp(T num, T max, T min) { num = (num < min) ? min : num; return (num > max) ? max : num; } // this MType must contain some of the same enum class MType : int { NoteOff = 0x80, NoteOn = 0x90, PKP = 0xA0, CC = 0xB0, PC = 0xC0, Aftertouch = 0xD0, PitchBend = 0xE0, System =0xF0 }; class Message { MType m; uint8_t midinote; double bender; // double bendamount; double velocity; // velocity is a 0-1 value; double pressure; // pressure is a 0-1 value; void* data; // for extended message types. float freq() { return (powf(2.0,(((float)midinote-69.0)/12.0)) * 440.0) + (bendamount * bender); } Midi::Message* toMidiMessage() { if (m >= MType::System) throw "Not able to convert to a std midi message"; unsigned int bend = 0x2000 + clamp((int)floor(bender * 0x2000), (int)-8191, (int)8191); unsigned int v = clamp((int) (velocity * 127), 0, 127); unsigned int p = clamp((int) (pressure * 127), 0, 127); return new Midi::VoiceMessage(); } }; } }