diff --git a/MEMLNaut-NISPS.ino b/MEMLNaut-NISPS.ino index c6a955f..63e4531 100644 --- a/MEMLNaut-NISPS.ino +++ b/MEMLNaut-NISPS.ino @@ -164,6 +164,8 @@ void loop() { digitalWrite(33, LOW); }, 100000) + + currentMode->loopCore0(); } @@ -231,5 +233,5 @@ void loop1() { PERIODIC_RUN_US( midi_interf->Poll(); - , 10000) + , 1000) } diff --git a/modes/AudioApps/BreakOrAudioApp.hpp b/modes/AudioApps/BreakOrAudioApp.hpp index f6c6804..0af9b1d 100644 --- a/modes/AudioApps/BreakOrAudioApp.hpp +++ b/modes/AudioApps/BreakOrAudioApp.hpp @@ -12,6 +12,7 @@ #include "../../src/memllib/interface/InterfaceBase.hpp" + #include #include "../../voicespaces/VoiceSpaces.hpp" @@ -59,7 +60,7 @@ inline bool __not_in_flash_func(ratioSeq)(float phasor, float phaseOffset, float } -template +template class BreakOrAudioApp : public AudioAppBase { public: @@ -68,6 +69,8 @@ public: queue_t bpmQueue; queue_t sequencerControlQueue; + queue_t i2cOutQueue; + bool sequencerPlaying = false; @@ -95,6 +98,7 @@ public: // currentVoiceSpace = voiceSpaces[0].mappingFunction; queue_init(&bpmQueue, sizeof(float), 1); queue_init(&sequencerControlQueue, sizeof(int), 1); + queue_init(&i2cOutQueue, sizeof(float) * 8, 1); }; bool __force_inline euclidean(float phase, const size_t n, const size_t k, const size_t offset, const float pulseWidth) @@ -121,14 +125,19 @@ public: midiIO->flushQueue(); } if (sequencingSampleCounter==0) { + + barPhasor += barPhasorInc; + if (barPhasor >= 1.f) { + barPhasor -= 1.f; + } + int i2cIdx=0; for(auto &seq: ratioSeqStates) { //update phasor - seq.phasor += (seq.phasorInc * seq.phasorMul); - if (seq.phasor >= 1.f) { - seq.phasor -= 1.f; - } - bool trig = ratioSeq<3>(seq.phasor, seq.phaseOffset, seq.ratioSum, seq.ratios, seq.pulseWidth); - bool highAmp = ratioSeq<2>(seq.phasor, seq.phaseOffset, seq.ampRatioSum, seq.ampRatios, 0.5f); + float seqPhasor = barPhasor * seq.phasorMul; + seqPhasor = fmodf(seqPhasor + seq.phaseOffset, 1.f); // Wrap phasor to [0,1] + + bool trig = ratioSeq<3>(seqPhasor, seq.phaseOffset, seq.ratioSum, seq.ratios, seq.pulseWidth); + bool highAmp = ratioSeq<2>(seqPhasor, seq.phaseOffset, seq.ampRatioSum, seq.ampRatios, 0.5f); if (trig && !seq.lastTrig) { if (trig) { midiIO->queueNoteOn(seq.midiNote, highAmp ? 127 : 64); @@ -137,8 +146,10 @@ public: } } seq.lastTrig = trig; + i2cValues[i2cIdx++] = trig; } midiIO->flushQueue(); + queue_try_add(&i2cOutQueue, &i2cValues); } sequencingSampleCounter ++; @@ -158,7 +169,7 @@ public: maxiSettings::sampleRate = sample_rate; sampleRatef = static_cast(sample_rate); updateBPM(90.f); - const size_t midiNotes[NSEQUENCES] = {36,37,38,39,40, 42,43,45,47,48}; + const size_t midiNotes[NSEQUENCES] = {36,37,38,39,40, 42,43,45/*,47,48*/}; size_t midiNote = 0; for(auto &seq: ratioSeqStates) { seq.midiNote = midiNotes[midiNote++]; @@ -174,7 +185,9 @@ public: } void ProcessParams(const std::array& params) - { + { + // if (sequencerPlaying) { + // } firstParamsReceived = true; if (queue_try_remove(&bpmQueue, &bpm)) { bpm = 30.f + (bpm * 200.f); // Scale BPM from [0,1] to [30,230] @@ -198,6 +211,7 @@ public: midiIO->queueClockStart(); midiIO->flushQueue(); } + Serial.printf("Sequencer %s\n", sequencerPlaying ? "Playing" : "Stopped"); } // currentVoiceSpace(params); size_t paramIdx = 0; @@ -210,7 +224,7 @@ public: v.ratioSum = sum; // static float muls[7] = {0.25f, 0.33f, 0.5f, 1.f, 1.5f, 2.f, 3.f}; // v.phasorMul = muls[(int)(params[paramIdx++] * 6.999999f)]; - static float muls[4] = {0.5f, 1.f, 2.f, 4.f}; + static float muls[4] = {1.f, 2.f, 4.f, 8.f}; v.phasorMul = muls[(int)(params[paramIdx++] * 3.999999f)]; v.phaseOffset = ((int)(params[paramIdx++] * timeSigBeats)) * timeSigBeatsInv; @@ -230,10 +244,10 @@ public: float beatLengthInSeconds = 60.f / bpm; float barLengthInSeconds = beatLengthInSeconds * timeSigBeats; float barLengthInSamples = barLengthInSeconds * (sampleRatef/ sequencingSampleDiv); - float barPhasorInc = 1.f/ barLengthInSamples; - for(auto &v: ratioSeqStates) { - v.phasorInc = barPhasorInc; - } + barPhasorInc = 1.f/ barLengthInSamples; + // for(auto &v: ratioSeqStates) { + // v.phasorInc = barPhasorInc; + // } float midiClockLengthInSeconds = beatLengthInSeconds / 24.f; float midiClockLengthInSamples = midiClockLengthInSeconds * sampleRatef; midiClockPhasorInc = 1.f / midiClockLengthInSamples; @@ -249,6 +263,8 @@ public: protected: + float i2cValues[8] = {0,0,0,0,0,0,0,0}; + float sampleRatef; bool firstParamsReceived = false; @@ -256,8 +272,11 @@ protected: float timeSigBeats=4.f; float timeSigBeatsInv=1.f/timeSigBeats; float timeSigDivision=4.f; + + float barPhasorInc=0.f; + float barPhasor; - size_t sequencingSampleDiv = 50; + size_t sequencingSampleDiv = 400; size_t sequencingSampleCounter = 0; std::array ratioSeqStates; diff --git a/modes/MEMLNautMode.hpp b/modes/MEMLNautMode.hpp index ad8c52a..5581259 100644 --- a/modes/MEMLNautMode.hpp +++ b/modes/MEMLNautMode.hpp @@ -23,5 +23,6 @@ concept MEMLNautMode = requires(T proc) { {proc.processAnalysisParams()} -> std::same_as; // {proc.getNMIDICtrlOutputs()} -> std::same_as; {proc.setupInterface()} -> std::same_as; + {proc.loopCore0()} -> std::same_as; requires std::same_as; }; diff --git a/modes/MEMLNautModeBreakOr.hpp b/modes/MEMLNautModeBreakOr.hpp index 27818e5..87d5e9f 100644 --- a/modes/MEMLNautModeBreakOr.hpp +++ b/modes/MEMLNautModeBreakOr.hpp @@ -11,11 +11,14 @@ #include "MEMLNautMode.hpp" #include #include +#include "../src/memllib/interface/USeqI2C.hpp" + class MEMLNautModeBreakOr { public: constexpr static size_t kN_InputParams = 4; // joystick x, y, rotate + USeqI2C i2cOut; inline static BreakOrAudioApp<> audioAppBreakOr; std::array::nVoiceSpaces> voiceSpaceList; @@ -24,6 +27,8 @@ public: bool sequencerPlaying = false; + + void setupInterface() { interface.setup(kN_InputParams, BreakOrAudioApp<>::kN_Params); interface.bindInterface(InterfaceRL::INPUT_MODES::JOYSTICK, true); @@ -36,22 +41,9 @@ public: queue_try_add(&audioAppBreakOr.sequencerControlQueue, &sequencerPlaying); } - // //tiggle up - // if (state) { - // //store output - // savedAction = action; - // actionBeingDragged=true; - // msgView->post("Where do you want it?"); - // }else{ - // //button up - // if (actionBeingDragged) { - // this->storeExperience(1.f, controlInput, savedAction); - // actionBeingDragged=false; - // msgView->post("Here!"); - // } - // } }); + i2cOut.begin(); } String getHelpTitle() { @@ -105,6 +97,17 @@ public: void analyse(stereosample_t) {} + float i2cValues[8]; + void loopCore0() { + PERIODIC_RUN_US( + if (queue_try_remove(&audioAppBreakOr.i2cOutQueue, &i2cValues)) { + // Serial.printf("i2c received: %f %f %f %f %f %f %f %f\n", i2cValues[0], i2cValues[1], i2cValues[2], i2cValues[3], i2cValues[4], i2cValues[5], i2cValues[6], i2cValues[7]); + bool i2cSuccess = i2cOut.sendValues(i2cValues, 8); + } + , 5000) + + } + }; diff --git a/modes/MEMLNautModeChannelStrip.hpp b/modes/MEMLNautModeChannelStrip.hpp index e9eefe4..593b2a1 100644 --- a/modes/MEMLNautModeChannelStrip.hpp +++ b/modes/MEMLNautModeChannelStrip.hpp @@ -105,5 +105,6 @@ public: void analyse(stereosample_t) {} + void loopCore0() {} }; diff --git a/modes/MEMLNautModePAFSynth.hpp b/modes/MEMLNautModePAFSynth.hpp index 9249943..3fd7152 100644 --- a/modes/MEMLNautModePAFSynth.hpp +++ b/modes/MEMLNautModePAFSynth.hpp @@ -115,4 +115,6 @@ public: void analyse(stereosample_t) {} + void loopCore0() {} + }; diff --git a/modes/MEMLNautModeSoundAnalysisMIDI.hpp b/modes/MEMLNautModeSoundAnalysisMIDI.hpp index ea06092..58c846f 100644 --- a/modes/MEMLNautModeSoundAnalysisMIDI.hpp +++ b/modes/MEMLNautModeSoundAnalysisMIDI.hpp @@ -85,4 +85,6 @@ public: } + void loopCore0() {} + }; diff --git a/modes/MEMLNautModeVerbFX.hpp b/modes/MEMLNautModeVerbFX.hpp index a264b6b..a58d284 100644 --- a/modes/MEMLNautModeVerbFX.hpp +++ b/modes/MEMLNautModeVerbFX.hpp @@ -15,7 +15,7 @@ class MEMLNautModeVerbFX { public: - constexpr static size_t kN_InputParams = XiasriAnalysis::kN_Params; //ML + constexpr static size_t kN_InputParams = XiasriAnalysis::kN_Params +4; //ML + joystick InterfaceRL interface; std::shared_ptr interfacePtr; XiasriAnalysis mlAnalysis{kSampleRate}; @@ -26,7 +26,7 @@ public: void setupInterface() { interface.setup(kN_InputParams, VerbFXAudioApp<>::kN_Params); - interface.bindInterface(InterfaceRL::INPUT_MODES::MACHINE_LISTENING); + interface.bindInterface(InterfaceRL::INPUT_MODES::JOYSTICK_AND_MACHINE_LISTENING); interfacePtr = make_non_owning(interface); } @@ -79,5 +79,7 @@ public: // , 100); } + + void loopCore0() {} }; diff --git a/modes/MEMLNautModeXIASRI.hpp b/modes/MEMLNautModeXIASRI.hpp index 403dda7..77a10f5 100644 --- a/modes/MEMLNautModeXIASRI.hpp +++ b/modes/MEMLNautModeXIASRI.hpp @@ -80,4 +80,6 @@ public: } + void loopCore0() {} + }; diff --git a/src/memllib b/src/memllib index 1693e46..1e420bf 160000 --- a/src/memllib +++ b/src/memllib @@ -1 +1 @@ -Subproject commit 1693e46e0b38c5920ebdf6cdf2a9107503003c8d +Subproject commit 1e420bf8ed869d58df75663d3dbf6870aa543de1