Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 13 additions & 16 deletions src/dsp/op_source.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ struct alignas(16) OpSource : public EnvelopeSupport<Patch::SourceNode>,
using EM = Patch::SourceNode::ExtendedMode;
auto em = static_cast<EM>(
static_cast<uint32_t>(std::round(sourceNode.extendedModeMode.value)));
if (em == EM::PHASE_REMAP || em == EM::RESONANT_SWEEP || em == EM::PINK_NOISE)
if (em == EM::PHASE_REMAP || em == EM::RESONANT_SWEEP || em == EM::NOISE)
{
extendedLagM.setRateInMilliseconds(10, monoValues.sr.samplerate, blockSizeInv);
extendedLagM.snapTo(sourceNode.extendedModeM.value);
Expand Down Expand Up @@ -194,7 +194,7 @@ struct alignas(16) OpSource : public EnvelopeSupport<Patch::SourceNode>,
using EM = Patch::SourceNode::ExtendedMode;
auto em =
static_cast<EM>(static_cast<uint32_t>(std::round(sourceNode.extendedModeMode.value)));
if (em == EM::PHASE_REMAP || em == EM::RESONANT_SWEEP || em == EM::PINK_NOISE)
if (em == EM::PHASE_REMAP || em == EM::RESONANT_SWEEP || em == EM::NOISE)
used = used || (sourceNode.lfoToExtendedModeM.value != 0);

return used;
Expand Down Expand Up @@ -443,30 +443,27 @@ struct alignas(16) OpSource : public EnvelopeSupport<Patch::SourceNode>,
}
break;
}
case EM::PINK_NOISE:
case EM::NOISE:
{
using NM = Patch::SourceNode::NoiseMode;
auto nm =
static_cast<NM>(static_cast<uint32_t>(std::round(sourceNode.pinkNoiseMode.value)));
static_cast<NM>(static_cast<uint32_t>(std::round(sourceNode.noiseMode.value)));
constexpr auto PMSAW = Patch::SourceNode::PhaseMapShape::SAW;
constexpr auto RWSAW = Patch::SourceNode::ResonantSweepWindow::SAW;
switch (nm)
{
case NM::ADD_TO_PHASE:
innerLoopImpl<EM::PINK_NOISE, PMSAW, RWSAW, NM::ADD_TO_PHASE>(onto, fbv, rf, dRF,
phs);
innerLoopImpl<EM::NOISE, PMSAW, RWSAW, NM::ADD_TO_PHASE>(onto, fbv, rf, dRF, phs);
break;
case NM::ADD_TO_SIGNAL:
innerLoopImpl<EM::PINK_NOISE, PMSAW, RWSAW, NM::ADD_TO_SIGNAL>(onto, fbv, rf, dRF,
phs);
innerLoopImpl<EM::NOISE, PMSAW, RWSAW, NM::ADD_TO_SIGNAL>(onto, fbv, rf, dRF, phs);
break;
case NM::MIX_WITH_SIGNAL:
innerLoopImpl<EM::PINK_NOISE, PMSAW, RWSAW, NM::MIX_WITH_SIGNAL>(onto, fbv, rf, dRF,
phs);
innerLoopImpl<EM::NOISE, PMSAW, RWSAW, NM::MIX_WITH_SIGNAL>(onto, fbv, rf, dRF,
phs);
break;
case NM::MUL_BY_SIGNAL:
innerLoopImpl<EM::PINK_NOISE, PMSAW, RWSAW, NM::MUL_BY_SIGNAL>(onto, fbv, rf, dRF,
phs);
innerLoopImpl<EM::NOISE, PMSAW, RWSAW, NM::MUL_BY_SIGNAL>(onto, fbv, rf, dRF, phs);
break;
}
break;
Expand All @@ -485,7 +482,7 @@ struct alignas(16) OpSource : public EnvelopeSupport<Patch::SourceNode>,
using EM = Patch::SourceNode::ExtendedMode;
using NMode = Patch::SourceNode::NoiseMode;
float nextM{0.f}, dM{0.f};
if constexpr (ET == EM::PHASE_REMAP || ET == EM::RESONANT_SWEEP || ET == EM::PINK_NOISE)
if constexpr (ET == EM::PHASE_REMAP || ET == EM::RESONANT_SWEEP || ET == EM::NOISE)
{
// Raw target m for this block: patch value + external mod + env / lfo contributions.
auto lfoFac = *lfoFacP;
Expand Down Expand Up @@ -560,20 +557,20 @@ struct alignas(16) OpSource : public EnvelopeSupport<Patch::SourceNode>,
nextM += dM;
out = window * st.at(kmph);
}
else if constexpr (ET == EM::PINK_NOISE)
else if constexpr (ET == EM::NOISE)
{
if (noisePos >= 16)
{
pinkNoise.generate16(noiseBuf);
noisePos = 0;
}
float noise = noiseBuf[noisePos++] * Patch::SourceNode::pinkNoiseScale;
float noise = noiseBuf[noisePos++] * Patch::SourceNode::noiseScale;
float m = nextM;
nextM += dM;
if constexpr (NM == NMode::ADD_TO_PHASE)
{
ph += static_cast<int32_t>(m * noise * phase::phaseMaxF *
Patch::SourceNode::pinkNoisePhaseScale);
Patch::SourceNode::noisePhaseScale);
out = st.at(ph);
}
else if constexpr (NM == NMode::ADD_TO_SIGNAL)
Expand Down
60 changes: 41 additions & 19 deletions src/synth/patch.h
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ struct Patch : pats::PatchBase<Patch, Param>
NONE = 0, // these value stream
PHASE_REMAP = 1, // CZ-style wave 1-4 wav(phase) -> wav(map(phase))
RESONANT_SWEEP = 2, // CZ-style resonant sweep (5-9)
PINK_NOISE = 3 // pink noise injection
NOISE = 3 // noise injection
};

enum struct NoiseMode : uint32_t
Expand All @@ -535,11 +535,19 @@ struct Patch : pats::PatchBase<Patch, Param>
MUL_BY_SIGNAL = 3,
};

// Pink noise from PinkNoise.generate16 has roughly ±0.25 typical amplitude;
enum struct NoiseType : uint32_t
{
WHITE = 0,
PINK = 1,
TILT = 2,
CHIP_LFSR = 3,
};

// Noise from PinkNoise.generate16 has roughly ±0.25 typical amplitude;
// scale up so M=1 reaches a useful range. ADD_TO_PHASE additionally needs
// attenuation since one full cycle of phase jitter is too much.
static constexpr float pinkNoiseScale = 4.0f;
static constexpr float pinkNoisePhaseScale = 0.1f;
static constexpr float noiseScale = 3.0f;
static constexpr float noisePhaseScale = 0.1f;

enum struct PhaseMapShape : uint32_t
{
Expand Down Expand Up @@ -744,7 +752,7 @@ struct Patch : pats::PatchBase<Patch, Param>
{(int)ExtendedMode::NONE, "None"},
{(int)ExtendedMode::PHASE_REMAP, "Phase Map"},
{(int)ExtendedMode::RESONANT_SWEEP, "Resonant Sweep"},
{(int)ExtendedMode::PINK_NOISE, "Pink Noise"},
{(int)ExtendedMode::NOISE, "Noise"},
})),
extendedModeM(floatMd(version_120b)
.asPercent()
Expand Down Expand Up @@ -823,18 +831,30 @@ struct Patch : pats::PatchBase<Patch, Param>
{(int)ResonantSweepFrequencyDepth::FOUR, "4 oct"},
{(int)ResonantSweepFrequencyDepth::TEN, "10 oct"},
})),
pinkNoiseMode(intMd(version_120f)
.withRange(0, 3)
.withDefault(0)
.withID(id(185, idx))
.withName(name(idx) + " Pink Noise Mode")
.withGroupName(name(idx))
.withUnorderedMapFormatting({
{(int)NoiseMode::ADD_TO_PHASE, "Add to Phase"},
{(int)NoiseMode::ADD_TO_SIGNAL, "Add to Signal"},
{(int)NoiseMode::MIX_WITH_SIGNAL, "Mix"},
{(int)NoiseMode::MUL_BY_SIGNAL, "Mul by Signal"},
}))
noiseMode(intMd(version_120f)
.withRange(0, 3)
.withDefault(0)
.withID(id(185, idx))
.withName(name(idx) + " Noise Mode")
.withGroupName(name(idx))
.withUnorderedMapFormatting({
{(int)NoiseMode::ADD_TO_PHASE, "Add to Phase"},
{(int)NoiseMode::ADD_TO_SIGNAL, "Add to Signal"},
{(int)NoiseMode::MIX_WITH_SIGNAL, "Mix"},
{(int)NoiseMode::MUL_BY_SIGNAL, "Mul by Signal"},
})),
noiseType(intMd(version_120f)
.withRange(0, 3)
.withDefault((int)NoiseType::PINK)
.withID(id(186, idx))
.withName(name(idx) + " Noise Type")
.withGroupName(name(idx))
.withUnorderedMapFormatting({
{(int)NoiseType::WHITE, "White"},
{(int)NoiseType::PINK, "Pink"},
{(int)NoiseType::TILT, "Tilt"},
{(int)NoiseType::CHIP_LFSR, "Chip LFSR"},
}))

{
index = idx;
Expand Down Expand Up @@ -877,7 +897,8 @@ struct Patch : pats::PatchBase<Patch, Param>
Param phaseMapModeShape;
Param resonantSweepWindowShape;
Param resonantSweepFrequencyDepth;
Param pinkNoiseMode;
Param noiseMode;
Param noiseType;

std::array<Param, numModsPer> modtarget;

Expand Down Expand Up @@ -909,7 +930,8 @@ struct Patch : pats::PatchBase<Patch, Param>
&phaseMapModeShape,
&resonantSweepWindowShape,
&resonantSweepFrequencyDepth,
&pinkNoiseMode};
&noiseMode,
&noiseType};
for (int i = 0; i < numModsPer; ++i)
res.push_back(&modtarget[i]);
appendDAHDSRParams(res);
Expand Down
Loading
Loading