シーケンサーのデータをSPIで送るテスト。UART出力停止

Dependencies:   Sequence mbed-rtos mbed Amp Envelope FilterController

Fork of SpiSequencerSender_Test by Ryo Od

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 
00004 #define UART_TRACE  (0)
00005 #include "SpiSequenceSender.h"
00006 #include "EnvelopeGenerator.h"
00007 #include "SpiAmpController.h"
00008 #include "SpiFilterController.h"
00009 
00010 #define SEQUENCE_N  (16)
00011 #define SPI_RATE    (8000000)
00012 
00013 const int samplingPeriod = 1;   // ms
00014 const int bpm = 120;
00015 const int envelopeLength = (60 * 1000 / (bpm * 4)) / samplingPeriod;
00016 const int waveShape = SpiSequenceSender::WAVESHAPE_SAW;
00017 const int baseNoteNumber = 48;
00018 
00019 // Initial Sequence
00020 const int noteOn[SEQUENCE_N] = { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0 };
00021 const int octave[SEQUENCE_N] = {-1,-1,-1, 0, 0,-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 };
00022 const int pitch[SEQUENCE_N]  = { 9, 7, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 };
00023 const int tie[SEQUENCE_N]    = { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 };
00024 
00025 //AnalogIn levelIn(A0);
00026 AnalogIn durationIn(A2);
00027 AnalogIn decayIn(A1);
00028 AnalogIn sustainIn(A0);
00029 AnalogIn cutoffIn(A3);
00030 AnalogIn resonanceIn(A4);
00031 
00032 SPI spiMaster(SPI_MOSI, SPI_MISO, SPI_SCK);
00033 
00034 Sequence sequence[SEQUENCE_N];
00035 SpiSequenceSender sequenceSender(&spiMaster, D9, sequence, SEQUENCE_N, samplingPeriod, bpm);
00036 
00037 Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047);
00038 EnvelopeGenerator envelopeGenerator;
00039 SpiAmpController ampController(&spiMaster, D8, D7);
00040 
00041 SpiFilterController filterController(&spiMaster, D10);
00042 
00043 void callbackFunction(int ticks)
00044 {
00045     if (ticks == 0) {
00046         envelopeGenerator.init(envelope);
00047     }
00048 
00049     if (sequenceSender.getSequences()[sequenceSender.getStep()].noteOn) {
00050         uint16_t level = envelopeGenerator.getModLevel();
00051         ampController.outDca(level);
00052     } else {
00053         ampController.outDca(0);
00054     }
00055     envelopeGenerator.update();
00056     
00057     filterController.outDCF();
00058 }
00059 
00060 int main()
00061 {
00062     spiMaster.format(8, 0);
00063     spiMaster.frequency(SPI_RATE);
00064     
00065     // Test SequencerSender Run
00066     //
00067     Sequence::baseNoteNumber = baseNoteNumber;
00068     sequenceSender.setBpm(bpm);
00069     
00070     for (int i = 0; i < SEQUENCE_N; i++) {
00071         Sequence& seq = sequenceSender.getSequences()[i];
00072         seq.setPitch(pitch[i]);
00073         seq.setOctave(octave[i]);
00074         seq.noteOn = noteOn[i];
00075         seq.tie = tie[i];
00076     }
00077     
00078     envelopeGenerator.init(envelope);
00079 
00080     sequenceSender.attachUpdate(&callbackFunction);
00081     sequenceSender.setWaveShape(waveShape);
00082     sequenceSender.run(0);
00083     
00084     for (;;) {
00085         /*
00086         sequenceSender.setPulseWidth(sequenceSender.getPulseWidth() + 4);
00087         Thread::wait(500);
00088         sequenceSender.setWaveShape(SpiSequenceSender::WAVESHAPE_SAW);
00089         Thread::wait(500);
00090         sequenceSender.setWaveShape(SpiSequenceSender::WAVESHAPE_SQUARE);
00091         */
00092         //envelope.setLevel(levelIn * 4095);
00093         envelope.setLevel(4095);
00094         envelope.setDuration(durationIn * envelopeLength);
00095         envelope.setDecay(decayIn * envelopeLength);
00096         envelope.setSustain(sustainIn * 4095);
00097         
00098         filterController.setCutoff(cutoffIn * 255);
00099         filterController.setResonance(resonanceIn * 255);
00100         
00101         #if(UART_TRACE)
00102         printf("%d\t%d\t%d\t%d\t%d\t%d\r\n",
00103             filterController.getCutoff(),
00104             filterController.getResonance(),
00105             envelope.getLevel(),
00106             envelope.getDuration(),
00107             envelope.getDecay(),
00108             envelope.getSustain()
00109         );
00110         #endif
00111     }
00112 }