amalgam/src/utils/Message.h

53 lines
1.7 KiB
C++

/*
* Filename: Message.h
*
* Description:
*
*
* Version:
* Created: Tue Mar 10 23:06:17 2020
* Revision: None
* Author: Rachel Fae Fox (foxiepaws),fox@foxiepa.ws
*
*/
#include <cstdint>
#include "midi/message.h"
namespace amalgam {
namespace Utils {
template <class T>
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();
}
};
}
}