Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Amp AverageAnalogIn BaseMachineUIController Envelope ExioBufferdController FilterController MCP23S17 PinDetect RotaryEncoder Sequence SequencerDisplay mbed-rtos mbed st7567LCD AT24C1024 OscController
main.cpp
- Committer:
- ryood
- Date:
- 2016-11-17
- Revision:
- 7:a47420a0c4bf
- Parent:
- 6:fd15586f72ff
- Child:
- 8:4e38bb44c72e
File content as of revision 7:a47420a0c4bf:
/*
* main.cpp
* BaseMachine Sequencer
*
* mbed Rev 121 / mbed-rtos Rev 117
*
* 2016.11.07 UIを統合
*
*/
#include "mbed.h"
#include "rtos.h"
#define UART_TRACE (0)
#include "BaseMachineCommon.h"
#include "BaseMachineUIController.h"
#include "SpiSequenceSender.h"
#include "EnvelopeGenerator.h"
#include "SpiAmpController.h"
#include "SpiFilterController.h"
#define SPI1_RATE (1000000)
const int samplingPeriod = 1; // ms
const int bpm = 120;
const int envelopeLength = (60 * 1000 / (bpm * 4)) / samplingPeriod;
const int waveShape = SpiSequenceSender::WAVESHAPE_SQUARE;
// Devices
//
BaseMachineUIController UIController;
//SPI1 (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
SPI SpiMaster(PA_7, PA_6, PA_5);
Sequence sequences[SEQUENCE_N];
SpiSequenceSender SequenceSender(&SpiMaster, D9, sequences, SEQUENCE_N, samplingPeriod, bpm);
Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047);
EnvelopeGenerator EnvelopeGenerator;
SpiAmpController AmpController(&SpiMaster, D8, D7);
SpiFilterController FilterController(&SpiMaster, D10);
// Grobal Variables
//
int playingStep = 0;
int editingStep = 0;
bool isRunning = false;
//------------------------------------------------------------------------
// Callback functions
//------------------------------------------------------------------------
void updateTicks(int ticks)
{
if (sequences[SequenceSender.getStep()].isNoteOn())
{
uint16_t level = EnvelopeGenerator.update();
if (!sequences[SequenceSender.getStep()].isAccent())
{
level = level * 1 / 2;
}
AmpController.outDca(level);
//printf("%d %d %d\r\n", playingStep, ticks, level);
}
else
{
AmpController.outDca(0);
}
FilterController.outDcf();
if (ticks == 0)
{
EnvelopeGenerator.init(envelope);
playingStep = SequenceSender.getStep();
UIController.setPlayingStep(playingStep);
}
}
//------------------------------------------------------------------------
// Functions
//------------------------------------------------------------------------
void setParams()
{
UIController.getSequences(&sequences);
SequenceSender.setBpm(UIController.getBpm());
// ToDo: Impl. accentLevel
OscillatorParam osc;
UIController.getOscillatorParam(&osc);
SequenceSender.setWaveShape(osc.waveShape);
SequenceSender.setPulseWidth(osc.pulseWidth << 1);
FilterParam flt;
UIController.getFilterParam(&flt);
FilterController.setCutoff(flt.cutoff << 1);
FilterController.setResonance(flt.resonance << 1);
EnvelopeParam env;
UIController.getEnvelopeParam(&env);
envelope.setLevel(env.level << 5);
//ToDo: Impl. envelope length
envelope.setLength(envelopeLength);
envelope.setDuration((float)env.duration / 128.0f * envelopeLength);
envelope.setDecay((float)env.decay / 128.0f * envelopeLength);
envelope.setSustain(env.sustain << 5);
bool _isRunning = UIController.getIsRunning();
if (_isRunning != isRunning)
{
isRunning = _isRunning;
if (isRunning)
{
SequenceSender.run(playingStep);
}
else
{
AmpController.outDca(0);
SequenceSender.stop();
}
}
}
//------------------------------------------------------------------------
// Main routine
//------------------------------------------------------------------------
int main()
{
#if (UART_TRACE)
printf("*** BaseMachine Sequencer ***\r\n");
#endif
//--------------------------------------------------------------------
// Initialize objects
//
Sequence::setBaseNoteNumber(baseNoteNumber);
//--------------------------------------------------------------------
// Setup Devices
//
SpiMaster.format(8, 0);
SpiMaster.frequency(SPI1_RATE);
// Mute output
AmpController.outDca(0);
UIController.init();
setParams();
EnvelopeGenerator.init(envelope);
SequenceSender.attachUpdate(&updateTicks);
SequenceSender.setWaveShape(waveShape);
//--------------------------------------------------------------------
// Main loop
//
for (;;)
{
UIController.update();
setParams();
Thread::wait(10);
}
}