OpenWareLaboratory
AbstractSynth.h
Go to the documentation of this file.
1 #ifndef __AbstractSynth_h__
2 #define __AbstractSynth_h__
3 
4 #include <climits>
5 #include "Synth.h"
6 #include "MidiProcessor.h"
7 #include "VelocityCurve.h"
8 
9 class AbstractSynth : public Synth, public MidiProcessor, public VelocityCurve {
10 protected:
11  uint8_t note = 60; // C4
12  float pb = 0;
13  float pb_range = 2/8192.0f;
14  float mod_range = 0.5/127.0f;
15  float tuning = 440;
16 public:
17  virtual ~AbstractSynth(){}
21  void setTuning(float value){
22  tuning = value;
23  }
24  float getTuning(){
25  return tuning;
26  }
30  uint8_t getNote(){
31  return note;
32  }
36  virtual void setNote(uint8_t note){
37  this->note = note;
39  }
43  float getPitchBend(){
44  return pb;
45  }
49  virtual void setPitchBend(float pb){
50  this->pb = pb;
52  }
57  return pb_range;
58  }
63  void setPitchBendRange(float range){
64  this->pb_range = range/8192.0f;
65  }
69  void setModulationDepthRange(float range){
70  mod_range = range / 127.0f;
71  }
72  // MIDI handlers
73  virtual void noteOn(MidiMessage msg) {
74  setNote(msg.getNote());
77  gate(true);
78  }
79  virtual void noteOff(MidiMessage msg) {
80  gate(false);
81  }
82  virtual void controlChange(MidiMessage msg) {
84  setModulation(msg.getControllerValue()/128.0f);
85  else if(msg.getControllerNumber() == MIDI_ALL_NOTES_OFF)
86  allNotesOff();
87  }
88  virtual void channelPressure(MidiMessage msg) {
89  setPressure(msg.getChannelPressure()/128.0f);
90  }
91  virtual void polyKeyPressure(MidiMessage msg) {
92  setPressure(msg.getPolyKeyPressure()/128.0f);
93  }
94  virtual void modulate(MidiMessage msg) {
96  }
97  virtual void pitchbend(MidiMessage msg) {
99  }
100  virtual void allNotesOff(){
101  gate(false);
102  }
103  // default implementations do nothing
104  virtual void setModulation(float modulation){}
105  virtual void setPressure(float pressure){}
106  // static utility methods
107  inline float frequencyToNote(float freq){
108  return 12 * log2f(freq / tuning) + 69;
109  }
110  inline float noteToFrequency(float note){
111  return tuning * exp2f((note - 69) / 12);
112  }
113 };
114 
115 #endif // __AbstractSynth_h__
@ MIDI_ALL_NOTES_OFF
Definition: MidiStatus.h:57
@ MIDI_CC_MODULATION
Definition: MidiStatus.h:36
virtual void noteOff(MidiMessage msg)
Definition: AbstractSynth.h:79
float noteToFrequency(float note)
virtual void setNote(uint8_t note)
Set note in whole semitones and update frequency.
Definition: AbstractSynth.h:36
void setModulationDepthRange(float range)
Set modulation depth range, from 0 to 1.0.
Definition: AbstractSynth.h:69
uint8_t getNote()
Set note in whole semitones.
Definition: AbstractSynth.h:30
virtual void channelPressure(MidiMessage msg)
Definition: AbstractSynth.h:88
void setPitchBendRange(float range)
Set pitch bend range in semitones.
Definition: AbstractSynth.h:63
virtual void pitchbend(MidiMessage msg)
Definition: AbstractSynth.h:97
virtual void allNotesOff()
void setTuning(float value)
Set frequency in Hertz for middle A (defaults to Stuttgart pitch, A440, 440 Hz)
Definition: AbstractSynth.h:21
virtual void setModulation(float modulation)
float frequencyToNote(float freq)
virtual void modulate(MidiMessage msg)
Definition: AbstractSynth.h:94
virtual void polyKeyPressure(MidiMessage msg)
Definition: AbstractSynth.h:91
float getTuning()
Definition: AbstractSynth.h:24
virtual void controlChange(MidiMessage msg)
Definition: AbstractSynth.h:82
virtual ~AbstractSynth()
Definition: AbstractSynth.h:17
float getPitchBendRange()
Get pitch bend range in semitones.
Definition: AbstractSynth.h:56
virtual void noteOn(MidiMessage msg)
Definition: AbstractSynth.h:73
virtual void setPitchBend(float pb)
Set pitch bend amount in semitones and update frequency.
Definition: AbstractSynth.h:49
float getPitchBend()
Get pitch bend amount in semitones.
Definition: AbstractSynth.h:43
virtual void setPressure(float pressure)
int16_t getPitchBend()
Get pitch bend value as a signed integer between -8192 and 8191.
Definition: MidiMessage.h:84
uint8_t getControllerValue()
Definition: MidiMessage.h:69
uint8_t getVelocity()
Definition: MidiMessage.h:63
uint8_t getControllerNumber()
Definition: MidiMessage.h:66
uint8_t getPolyKeyPressure()
Definition: MidiMessage.h:75
uint8_t getChannelPressure()
Definition: MidiMessage.h:72
uint8_t getNote()
Definition: MidiMessage.h:60
Base class for MIDI processors such as AbstractSynth.
Definition: MidiProcessor.h:11
Definition: Synth.h:6
virtual void setGain(float gain)=0
virtual void gate(bool state)=0
virtual void setFrequency(float freq)=0
General MIDI DLS Level 1 Specification: The MIDI Note Velocity value is converted to attenuation in d...
Definition: VelocityCurve.h:14
float velocityToGain(float v)
Definition: VelocityCurve.h:25