12-polyphonic "chiptune" MIDI synthesizer for LPC1768 (Standalone version)

Dependencies:   ClockControl PowerControl mbed

Instrument.h

Committer:
kayekss
Date:
2014-12-23
Revision:
6:cda45a5e723e
Parent:
4:b2423ad4b248

File content as of revision 6:cda45a5e723e:

#ifndef INSTRUMENT_H_
#define INSTRUMENT_H_

#include <stdint.h>
#include "Wavetable.h"

class Instrument {
private:
    uint16_t          samplingRate;      // sampling rate
    uint8_t           channelId;         // channel ID
    bool              enableFlag;        // enable flag (whether this instrument is enabled)
    int32_t           soundingPosition;  // currently sounding note position
    uint32_t          duration;          // sounding duration
    Wavetable::wave_t wave;          // wave parameters
    uint16_t          frequency;         // wave frequency
    uint8_t           masterVolume;      // + master volume
    uint8_t           volume;            //    |- volume
    uint8_t           expression;        //    |- expression    (volume multiplier)
    uint8_t           velocity;          //    |- note velocity (volume multiplier)
    uint16_t          phase;             // current phase          (x256)
    uint16_t          phaseDelta;        // phase delta per sample (x256)
    
public:
    Instrument();
    ~Instrument();

    void enable();
    void disable();
    void setSamplingRate(uint16_t);
    void advancePhase();
    void resetPhase();
    void setWave(Wavetable::wave_t);
    void setFrequency(uint16_t);
    void setVolume(uint8_t);
    void setExpression(uint8_t);
    void setVelocity(uint8_t);
    void resetDuration();
    
    uint16_t getSamplingRate();
    uint8_t getChannelId();
    bool isEnable();
    int16_t getSoundingPosition();
    uint32_t getDuration();
    Wavetable::wave_t getWave();
    uint16_t getFrequency();
    uint8_t getMasterVolume();
    uint8_t getVolume();
    uint8_t getExpression();
    uint8_t getVelocity();
    uint16_t getPhase();
    uint16_t getPhaseDelta();
    
private:
    void calculatePhaseDelta();
    void calculateMasterVolume();
};

#endif