mirror of
https://codeberg.org/armin/trommelkiste.git
synced 2026-09-01 12:20:46 +02:00
Update plugin editor and processor
This commit is contained in:
parent
c774d521c8
commit
9bddd6076f
3 changed files with 127 additions and 78 deletions
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue