53 lines
1.7 KiB
C++
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();
|
|
|
|
}
|
|
};
|
|
}
|
|
}
|