Update plugin editor and processor

This commit is contained in:
Armin 2026-07-20 16:09:31 +02:00
commit 9bddd6076f
3 changed files with 127 additions and 78 deletions

View file

@ -84,7 +84,33 @@ void TrommelkisteProcessor::processBlock(juce::AudioBuffer<float>& buffer, juce:
const bool barAllowed = (divBars == 0) || !hasTransport || (currentBar % divBars == 0);
// Process pending shuffle events
const int baseDelay = (int)(currentSampleRate * 0.05 * globalGroove); // up to 50ms at max groove
for (int i = numPendingShuffle - 1; i >= 0; --i)
{
pendingShuffle[i].delaySamples -= numSamples;
if (pendingShuffle[i].delaySamples <= 0)
{
handleNoteOn(pendingShuffle[i].trackIndex, pendingShuffle[i].velocity);
pendingShuffle[i] = pendingShuffle[--numPendingShuffle];
}
}
// Independent shuffle: generate events even without MIDI input
std::uniform_real_distribution<float> dist(0.0f, 1.0f);
if (globalShuffleAmt > 0.0f && barAllowed)
{
std::uniform_int_distribution<int> trackDist(0, NUM_TRACKS - 1);
float prob = globalShuffleAmt * 0.15f; // base probability per block
if (dist(rng) < prob && numPendingShuffle < MAX_PENDING_SHUFFLE)
{
int target = trackDist(rng);
float vel = (0.3f + dist(rng) * 0.5f) * globalShuffleAmt;
int delay = (int)(baseDelay * (0.5f + dist(rng) * 0.5f));
pendingShuffle[numPendingShuffle++] = { target, vel, delay };
}
}
for (const auto metadata : midi)
{
auto msg = metadata.getMessage();
@ -101,22 +127,28 @@ void TrommelkisteProcessor::processBlock(juce::AudioBuffer<float>& buffer, juce:
if (effShuffle > 0.0f && barAllowed)
{
// Random note repeat on same drum
if (dist(rng) < effShuffle * 0.5f)
handleNoteOn(t, msg.getFloatVelocity() * effShuffle * 0.7f);
int maxEvents = juce::jmax(1, (int)(effShuffle * 3.0f + 0.5f));
int numEvents = std::uniform_int_distribution<int>(0, maxEvents)(rng);
// Ghost note on random other drum
if (dist(rng) < effShuffle * 0.9f)
for (int e = 0; e < numEvents; ++e)
{
int ghostTrack = t;
while (ghostTrack == t)
ghostTrack = std::uniform_int_distribution<int>(0, NUM_TRACKS - 1)(rng);
handleNoteOn(ghostTrack, msg.getFloatVelocity() * effShuffle);
bool sameTrack = dist(rng) < 0.35f;
int target = t;
if (!sameTrack)
{
target = std::uniform_int_distribution<int>(0, NUM_TRACKS - 1)(rng);
if (target == t)
target = (t + 1 + std::uniform_int_distribution<int>(0, NUM_TRACKS - 2)(rng)) % NUM_TRACKS;
}
float vel = msg.getFloatVelocity() * (0.3f + dist(rng) * 0.7f) * effShuffle;
if (numPendingShuffle < MAX_PENDING_SHUFFLE)
{
int delay = (int)(baseDelay * (0.5f + dist(rng) * 0.5f));
pendingShuffle[numPendingShuffle++] = { target, vel, delay };
}
}
}
if (shuffleAmt > 0.0f && globalGroove > 0.0f)
handleNoteOn(t, msg.getFloatVelocity() * (1.0f + globalGroove * 0.3f * shuffleAmt));
}
}
else if (msg.isNoteOff())
@ -572,7 +604,7 @@ static const TrommelkisteProcessor::Kit kits[] = {
"BT7A0D3", "RIM127", "ST7T7S3", "HANDCLP1", "HHCD2",
"CLOP1", "HHOD2", "RIDED2", "LT7D3", "MT7D3" } },
{ "Soft", {
"BT0A0D7", "RIM63", "ST0T0S7", "HANDCLP2", "HHCD8",
"BT0A0DA", "RIM63", "ST0T0S7", "HANDCLP2", "HHCD8",
"CLOP4", "HHOD8", "RIDED8", "LT0D7", "MT0D7" } },
{ "Raw", {
"BTAAADA", "RIM127", "STATASA", "HANDCLP1", "HHCDA",