breakcore!!!

This commit is contained in:
chriskiefer 2026-02-22 21:03:50 +00:00
parent 9498f77278
commit 497f1c8dfb
2 changed files with 100 additions and 40 deletions

View file

@ -16,10 +16,42 @@
#include "../../voicespaces/VoiceSpaces.hpp" #include "../../voicespaces/VoiceSpaces.hpp"
struct ratioSeqState {
std::array<float, 3> ratios{1.f};
float phasor=0.f;
float phasorInc=0.f;
bool lastTrig = false;
float phasorMul = 1.f;
float ratioSum=1.f;
int midiNote = 36;
float pulseWidth = 0.5f;
};
template<size_t seqLength>
inline bool __not_in_flash_func(ratioSeq)(ratioSeqState &seq) {
bool trig = 0;
float phaseAdj = seq.ratioSum * seq.phasor;
float accumulatedSum = 0;
float lastAccumulatedSum = 0;
for (size_t v : seq.ratios)
{
accumulatedSum += v;
if (phaseAdj <= accumulatedSum)
{
// check pulse width
//TODO: could precalc acc-lastacc
float beatPhase = (phaseAdj - lastAccumulatedSum) /
(accumulatedSum - lastAccumulatedSum);
trig = beatPhase <= seq.pulseWidth;
break;
}
lastAccumulatedSum = accumulatedSum;
}
return trig;
}
template<size_t NPARAMS=33> template<size_t NPARAMS=50, size_t NSEQUENCES=10>
class BreakOrAudioApp : public AudioAppBase<NPARAMS> class BreakOrAudioApp : public AudioAppBase<NPARAMS>
{ {
public: public:
@ -48,7 +80,6 @@ public:
BreakOrAudioApp() : AudioAppBase<NPARAMS>() { BreakOrAudioApp() : AudioAppBase<NPARAMS>() {
// currentVoiceSpace = voiceSpaces[0].mappingFunction; // currentVoiceSpace = voiceSpaces[0].mappingFunction;
}; };
bool __force_inline euclidean(float phase, const size_t n, const size_t k, const size_t offset, const float pulseWidth) bool __force_inline euclidean(float phase, const size_t n, const size_t k, const size_t offset, const float pulseWidth)
@ -67,12 +98,31 @@ public:
stereosample_t __force_inline Process(const stereosample_t x) override stereosample_t __force_inline Process(const stereosample_t x) override
{ {
phasor0 += 1.f; if (sequencingSampleCounter==0) {
if (phasor0>=48000.f) { for(auto &seq: ratioSeqStates) {
phasor0-=48000.f; //update phasor
midiIO->queueNoteOn(36, 127); seq.phasor += (seq.phasorInc * seq.phasorMul);
if (seq.phasor >= 1.f) {
seq.phasor -= 1.f;
}
bool trig = ratioSeq<3>(seq);
if (trig && !seq.lastTrig) {
if (trig) {
midiIO->queueNoteOn(seq.midiNote, 127);
}else{
midiIO->queueNoteOff(seq.midiNote, 0);
}
}
seq.lastTrig = trig;
}
midiIO->flushQueue(); midiIO->flushQueue();
} }
sequencingSampleCounter ++;
if (sequencingSampleCounter >= sequencingSampleDiv) {
sequencingSampleCounter = 0;
}
stereosample_t ret { 0.f,0.f }; stereosample_t ret { 0.f,0.f };
return ret; return ret;
} }
@ -82,7 +132,13 @@ public:
AudioAppBase<NPARAMS>::Setup(sample_rate, interface); AudioAppBase<NPARAMS>::Setup(sample_rate, interface);
maxiSettings::sampleRate = sample_rate; maxiSettings::sampleRate = sample_rate;
sampleRatef = static_cast<float>(sample_rate); sampleRatef = static_cast<float>(sample_rate);
updateBPM(90.f);
size_t midiNote = 36;
for(auto &seq: ratioSeqStates) {
seq.midiNote = midiNote++;
} }
}
void setupMIDI(std::shared_ptr<MIDIInOut> new_midi_interf) { void setupMIDI(std::shared_ptr<MIDIInOut> new_midi_interf) {
midiIO = new_midi_interf; midiIO = new_midi_interf;
} }
@ -95,6 +151,34 @@ public:
{ {
firstParamsReceived = true; firstParamsReceived = true;
// currentVoiceSpace(params); // currentVoiceSpace(params);
size_t paramIdx = 0;
for(auto &v: ratioSeqStates) {
float sum=0.f;
for(size_t i=0; i < v.ratios.size(); i++) {
v.ratios[i] = (float)(int)(params[paramIdx++] * 7.f) + 1.f;
sum += v.ratios[i];
}
v.ratioSum = sum;
v.phasorMul = ((float)(int)(params[paramIdx++] * 2.f) * 0.5f)+ 1.f;
}
}
void updateBPM(float newBPM) {
bpm = newBPM;
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;
}
}
void setTimeSignature(float beats, float division) {
timeSigBeats = beats;
timeSigDivision = division;
updateBPM(bpm); // Recalculate phasor increment with new time signature
} }
@ -104,7 +188,15 @@ protected:
float sampleRatef; float sampleRatef;
bool firstParamsReceived = false; bool firstParamsReceived = false;
float phasor0=0.f; float bpm=90.f;
float timeSigBeats=4.f;
float timeSigDivision=4.f;
size_t sequencingSampleDiv = 50; // How often the sequencer should update (in Hz)
size_t sequencingSampleCounter = 0;
std::array<ratioSeqState, NSEQUENCES> ratioSeqStates;
}; };
#endif // __BREAKOR_AUDIO_APP_HPP__ #endif // __BREAKOR_AUDIO_APP_HPP__

View file

@ -77,37 +77,5 @@ public:
}; };
/*
// BODY
Value result = Value::nil();
auto ratios = args[0].as_sequential();
const auto pulseWidth = args[1].as_float();
const auto phase = args[2].as_float();
double trig = 0;
double ratioSum = 0;
for (Value v : ratios)
{
ratioSum += v.as_float();
}
double phaseAdj = ratioSum * phase;
double accumulatedSum = 0;
double lastAccumulatedSum = 0;
for (Value v : ratios)
{
accumulatedSum += v.as_float();
if (phaseAdj <= accumulatedSum)
{
// check pulse width
double beatPhase = (phaseAdj - lastAccumulatedSum) /
(accumulatedSum - lastAccumulatedSum);
trig = beatPhase <= pulseWidth;
break;
}
lastAccumulatedSum = accumulatedSum;
}
result = Value(trig);
*/
#endif // MEMLNAUT_MODE_RHYTHM_BOX_HPP #endif // MEMLNAUT_MODE_RHYTHM_BOX_HPP