From de150f60fcb41ab4cfc6096884b08df318879280 Mon Sep 17 00:00:00 2001 From: Takamitsu Endo Date: Sat, 16 Nov 2024 06:17:23 +0900 Subject: [PATCH] Change to reduce click when proper note IDs are not provided from DAW --- ClangSynth/source/dsp/dspcore.cpp | 1 - ClangSynth/source/version.hpp | 8 +- CollidingCombSynth/source/dsp/dspcore.cpp | 1 - CollidingCombSynth/source/version.hpp | 8 +- CubicPadSynth/source/dsp/dspcore.cpp | 9 +- CubicPadSynth/source/version.hpp | 8 +- EnvelopedSine/source/dsp/dspcore.cpp | 2 +- EnvelopedSine/source/version.hpp | 8 +- IterativeSinCluster/source/dsp/dspcore.cpp | 10 +- IterativeSinCluster/source/dsp/envelope.hpp | 22 ++-- IterativeSinCluster/source/plugprocessor.cpp | 1 + IterativeSinCluster/source/version.hpp | 8 +- LightPadSynth/source/dsp/dspcore.cpp | 1 - LightPadSynth/source/version.hpp | 8 +- SyncSawSynth/source/dsp/dspcore.cpp | 20 ++-- SyncSawSynth/source/dsp/envelope.hpp | 11 +- SyncSawSynth/source/plugprocessor.cpp | 14 +-- SyncSawSynth/source/version.hpp | 8 +- TestBedSynth/source/dsp/dspcore.cpp | 1 - TestBedSynth/source/version.hpp | 8 +- docs/manual/ClangSynth/ClangSynth.json | 11 +- docs/manual/ClangSynth/ClangSynth_en.html | 21 +++- docs/manual/ClangSynth/ClangSynth_ja.html | 21 +++- .../CollidingCombSynth.json | 11 +- .../CollidingCombSynth_en.html | 21 +++- .../CollidingCombSynth_ja.html | 21 +++- docs/manual/CubicPadSynth/CubicPadSynth.json | 11 +- .../CubicPadSynth/CubicPadSynth_en.html | 21 +++- .../CubicPadSynth/CubicPadSynth_ja.html | 21 +++- docs/manual/EnvelopedSine/EnvelopedSine.json | 11 +- .../EnvelopedSine/EnvelopedSine_en.html | 21 +++- .../EnvelopedSine/EnvelopedSine_ja.html | 21 +++- .../IterativeSinCluster.json | 11 +- .../IterativeSinCluster_en.html | 21 +++- .../IterativeSinCluster_ja.html | 21 +++- docs/manual/LightPadSynth/LightPadSynth.json | 11 +- .../LightPadSynth/LightPadSynth_en.html | 21 +++- .../LightPadSynth/LightPadSynth_ja.html | 106 +++++++++++++++++- docs/manual/LightPadSynth/LightPadSynth_ja.md | 65 +++-------- docs/manual/SyncSawSynth/SyncSawSynth.json | 11 +- docs/manual/SyncSawSynth/SyncSawSynth_en.html | 21 +++- docs/manual/SyncSawSynth/SyncSawSynth_ja.html | 21 +++- 42 files changed, 456 insertions(+), 222 deletions(-) diff --git a/ClangSynth/source/dsp/dspcore.cpp b/ClangSynth/source/dsp/dspcore.cpp index 73f29fcb..5d75b629 100644 --- a/ClangSynth/source/dsp/dspcore.cpp +++ b/ClangSynth/source/dsp/dspcore.cpp @@ -461,7 +461,6 @@ void DSPCore::noteOn( // Pick up note from resting one. for (size_t index = 0; index < nVoice; ++index) { - if (notes[index].id == noteId) noteIndices.push_back(index); if (notes[index].state == NoteState::rest) noteIndices.push_back(index); if (noteIndices.size() >= nUnison) break; } diff --git a/ClangSynth/source/version.hpp b/ClangSynth/source/version.hpp index 88a7483e..f57bff91 100644 --- a/ClangSynth/source/version.hpp +++ b/ClangSynth/source/version.hpp @@ -16,11 +16,11 @@ #define SUB_VERSION_STR "1" #define SUB_VERSION_INT 1 -#define RELEASE_NUMBER_STR "9" -#define RELEASE_NUMBER_INT 9 +#define RELEASE_NUMBER_STR "10" +#define RELEASE_NUMBER_INT 10 -#define BUILD_NUMBER_STR "10" -#define BUILD_NUMBER_INT 10 +#define BUILD_NUMBER_STR "11" +#define BUILD_NUMBER_INT 11 #define FULL_VERSION_STR \ MAJOR_VERSION_STR "." SUB_VERSION_STR "." RELEASE_NUMBER_STR "." BUILD_NUMBER_STR diff --git a/CollidingCombSynth/source/dsp/dspcore.cpp b/CollidingCombSynth/source/dsp/dspcore.cpp index 3952a5da..9e0d1eff 100644 --- a/CollidingCombSynth/source/dsp/dspcore.cpp +++ b/CollidingCombSynth/source/dsp/dspcore.cpp @@ -293,7 +293,6 @@ void DSPCore::noteOn(int32_t noteId, int16_t pitch, float tuning, float velocity // Pick up note from resting one. for (uint32_t index = 0; index < nVoice; ++index) { - if (notes[index].id == noteId) noteIndices.push_back(index); if (notes[index].state == NoteState::rest) noteIndices.push_back(index); if (noteIndices.size() >= nUnison) break; } diff --git a/CollidingCombSynth/source/version.hpp b/CollidingCombSynth/source/version.hpp index 972fd58a..a00dc28a 100644 --- a/CollidingCombSynth/source/version.hpp +++ b/CollidingCombSynth/source/version.hpp @@ -16,11 +16,11 @@ #define SUB_VERSION_STR "1" #define SUB_VERSION_INT 1 -#define RELEASE_NUMBER_STR "16" -#define RELEASE_NUMBER_INT 16 +#define RELEASE_NUMBER_STR "17" +#define RELEASE_NUMBER_INT 17 -#define BUILD_NUMBER_STR "16" -#define BUILD_NUMBER_INT 16 +#define BUILD_NUMBER_STR "17" +#define BUILD_NUMBER_INT 17 #define FULL_VERSION_STR \ MAJOR_VERSION_STR "." SUB_VERSION_STR "." RELEASE_NUMBER_STR "." BUILD_NUMBER_STR diff --git a/CubicPadSynth/source/dsp/dspcore.cpp b/CubicPadSynth/source/dsp/dspcore.cpp index db8b7492..93659c01 100755 --- a/CubicPadSynth/source/dsp/dspcore.cpp +++ b/CubicPadSynth/source/dsp/dspcore.cpp @@ -61,7 +61,7 @@ void NOTE_NAME::noteOn( unit.lfo.setFrequency(vecIndex, sampleRate, 1.0f); if (param.value[ID::lfoPhaseReset]->getInt()) unit.lfo.reset(vecIndex); - std::uniform_real_distribution dist(0.0, 1.0); + std::uniform_real_distribution dist(0.0f, 1.0f); unit.notePitch.insert(vecIndex, notePitch); if (param.value[ID::oscPhaseReset]->getInt()) { const auto phaseRnd @@ -402,7 +402,6 @@ void DSPCORE_NAME::noteOn(int32_t identifier, int16_t pitch, float tuning, float // Pick up note from resting one. for (size_t index = 0; index < nVoice; ++index) { - if (notes[index].id == identifier) noteIndices.push_back(index); if (notes[index].state == NoteState::rest) noteIndices.push_back(index); if (noteIndices.size() >= nUnison) break; } @@ -549,6 +548,12 @@ void DSPCORE_NAME::fillTransitionBuffer(size_t noteIndex) float gain0 = unit.gain0[vecIndex]; float gain1 = unit.gain1[vecIndex]; + + // Don't write to `transitionBuffer` twice in a row. `noteOn` must be called for this + // voice after this method. + unit.gain0.insert(vecIndex, 0.0f); + unit.gain1.insert(vecIndex, 0.0f); + float pitch = unit.lowpassPitch[vecIndex] + unit.pitch[vecIndex]; trOsc.phase = unit.osc.phase.extract(vecIndex); trOsc.tick = unit.osc.tick.extract(vecIndex); diff --git a/CubicPadSynth/source/version.hpp b/CubicPadSynth/source/version.hpp index 3dda47c5..d60931d2 100755 --- a/CubicPadSynth/source/version.hpp +++ b/CubicPadSynth/source/version.hpp @@ -16,11 +16,11 @@ #define SUB_VERSION_STR "1" #define SUB_VERSION_INT 1 -#define RELEASE_NUMBER_STR "26" -#define RELEASE_NUMBER_INT 26 +#define RELEASE_NUMBER_STR "27" +#define RELEASE_NUMBER_INT 27 -#define BUILD_NUMBER_STR "26" -#define BUILD_NUMBER_INT 26 +#define BUILD_NUMBER_STR "27" +#define BUILD_NUMBER_INT 27 #define FULL_VERSION_STR \ MAJOR_VERSION_STR "." SUB_VERSION_STR "." RELEASE_NUMBER_STR "." BUILD_NUMBER_STR diff --git a/EnvelopedSine/source/dsp/dspcore.cpp b/EnvelopedSine/source/dsp/dspcore.cpp index df39aef2..30f8464c 100644 --- a/EnvelopedSine/source/dsp/dspcore.cpp +++ b/EnvelopedSine/source/dsp/dspcore.cpp @@ -329,7 +329,7 @@ void DSPCORE_NAME::noteOn(int32_t identifier, int16_t pitch, float tuning, float size_t index = 0; while (index < indices.size() && noteIndices.size() < nUnison) { const auto ndx = indices[index]; - if (notes[ndx].id == identifier || notes[ndx].state == NoteState::rest) { + if (notes[ndx].state == NoteState::rest) { noteIndices.push_back(ndx); indices.erase(indices.begin() + index); } else { diff --git a/EnvelopedSine/source/version.hpp b/EnvelopedSine/source/version.hpp index e874e4df..d18e10a0 100644 --- a/EnvelopedSine/source/version.hpp +++ b/EnvelopedSine/source/version.hpp @@ -16,11 +16,11 @@ #define SUB_VERSION_STR "1" #define SUB_VERSION_INT 1 -#define RELEASE_NUMBER_STR "25" -#define RELEASE_NUMBER_INT 25 +#define RELEASE_NUMBER_STR "26" +#define RELEASE_NUMBER_INT 26 -#define BUILD_NUMBER_STR "25" -#define BUILD_NUMBER_INT 25 +#define BUILD_NUMBER_STR "26" +#define BUILD_NUMBER_INT 26 #define FULL_VERSION_STR \ MAJOR_VERSION_STR "." SUB_VERSION_STR "." RELEASE_NUMBER_STR "." BUILD_NUMBER_STR diff --git a/IterativeSinCluster/source/dsp/dspcore.cpp b/IterativeSinCluster/source/dsp/dspcore.cpp index 8044f871..cedfa7e9 100644 --- a/IterativeSinCluster/source/dsp/dspcore.cpp +++ b/IterativeSinCluster/source/dsp/dspcore.cpp @@ -163,6 +163,7 @@ template void NOTE_NAME::rest() state = NoteState::rest; id = -1; gain = 0; + gainEnvelope.terminate(); } template std::array NOTE_NAME::process() @@ -340,7 +341,6 @@ void DSPCORE_NAME::noteOn(int32_t noteId, int16_t pitch, float tuning, float vel size_t mostSilent = 0; float gain = 1.0f; for (; noteIdx < nVoice; ++noteIdx) { - if (notes[noteIdx].id == noteId) break; if (notes[noteIdx].state == NoteState::rest) break; if (!notes[noteIdx].gainEnvelope.isAttacking() && notes[noteIdx].gain < gain) { gain = notes[noteIdx].gain; @@ -383,11 +383,7 @@ void DSPCORE_NAME::noteOn(int32_t noteId, int16_t pitch, float tuning, float vel void DSPCORE_NAME::noteOff(int32_t noteId) { - size_t i = 0; - for (; i < notes.size(); ++i) { - if (notes[i].id == noteId) break; + for (auto &x : notes) { + if (x.id == noteId && x.state != NoteState::release) x.release(); } - if (i >= notes.size()) return; - - notes[i].release(); } diff --git a/IterativeSinCluster/source/dsp/envelope.hpp b/IterativeSinCluster/source/dsp/envelope.hpp index 708df998..9bd33bfd 100644 --- a/IterativeSinCluster/source/dsp/envelope.hpp +++ b/IterativeSinCluster/source/dsp/envelope.hpp @@ -121,17 +121,15 @@ template class ExpADSREnvelope { Sample sustainLevel, Sample releaseTime, Sample noteFreq, - Sample curve) + Sample curve_) { - if (declickCounter >= declickLength || state == State::terminated) declickCounter = 0; + declickCounter = 0; state = State::attack; sustain = std::max(Sample(0.0), std::min(sustainLevel, Sample(1.0))); - offset = value; - range = Sample(1.0) - value; - - this->curve = curve; + range = Sample(1); + curve = curve_; attackTime = adaptTime(attackTime, noteFreq); atk.reset(sampleRate, attackTime); @@ -182,7 +180,6 @@ template class ExpADSREnvelope { { state = State::terminated; value = 0; - offset = 0; range = 1; sustain = 1; } @@ -204,7 +201,7 @@ template class ExpADSREnvelope { case State::attack: { const auto atkPos = atk.process(); const auto atkMix = atkPos + curve * (atkNeg.process() - atkPos); - value = range * declickIn(atkMix) + offset; + value = range * atkMix; if (atk.isTerminated()) { state = State::decay; range = Sample(1.0) - sustain; @@ -212,23 +209,23 @@ template class ExpADSREnvelope { } break; case State::decay: - value = range * declickIn(dec.process()) + sustain; + value = range * dec.process() + sustain; if (value <= sustain) state = State::sustain; break; case State::sustain: - value = declickIn(sustain); + value = sustain; break; case State::release: - value = range * declickIn(rel.process()); + value = range * rel.process(); if (rel.isTerminated()) state = State::terminated; break; default: return 0; } - return value; + return declickIn(value); } protected: @@ -246,7 +243,6 @@ template class ExpADSREnvelope { Sample value = 0; Sample curve = 0; Sample sampleRate = 44100; - Sample offset = 0; Sample range = 1; Sample sustain = 1; }; diff --git a/IterativeSinCluster/source/plugprocessor.cpp b/IterativeSinCluster/source/plugprocessor.cpp index ae07b07b..5e61f0fd 100644 --- a/IterativeSinCluster/source/plugprocessor.cpp +++ b/IterativeSinCluster/source/plugprocessor.cpp @@ -72,6 +72,7 @@ tresult PLUGIN_API PlugProcessor::setActive(TBool state) if (state) { dsp->setup(processSetup.sampleRate); } else { + dsp->reset(); lastState = 0; } return AudioEffect::setActive(state); diff --git a/IterativeSinCluster/source/version.hpp b/IterativeSinCluster/source/version.hpp index a43fe07f..3f097538 100644 --- a/IterativeSinCluster/source/version.hpp +++ b/IterativeSinCluster/source/version.hpp @@ -16,11 +16,11 @@ #define SUB_VERSION_STR "1" #define SUB_VERSION_INT 1 -#define RELEASE_NUMBER_STR "27" -#define RELEASE_NUMBER_INT 27 +#define RELEASE_NUMBER_STR "28" +#define RELEASE_NUMBER_INT 28 -#define BUILD_NUMBER_STR "27" -#define BUILD_NUMBER_INT 27 +#define BUILD_NUMBER_STR "28" +#define BUILD_NUMBER_INT 28 #define FULL_VERSION_STR \ MAJOR_VERSION_STR "." SUB_VERSION_STR "." RELEASE_NUMBER_STR "." BUILD_NUMBER_STR diff --git a/LightPadSynth/source/dsp/dspcore.cpp b/LightPadSynth/source/dsp/dspcore.cpp index 44f4107e..41d4d3e5 100755 --- a/LightPadSynth/source/dsp/dspcore.cpp +++ b/LightPadSynth/source/dsp/dspcore.cpp @@ -392,7 +392,6 @@ void DSPCore::noteOn(int32_t identifier, int16_t pitch, float tuning, float velo // Pick up note from resting one. for (size_t index = 0; index < nVoice; ++index) { - if (notes[index].id == identifier) noteIndices.push_back(index); if (notes[index].state == NoteState::rest) noteIndices.push_back(index); if (noteIndices.size() >= nUnison) break; } diff --git a/LightPadSynth/source/version.hpp b/LightPadSynth/source/version.hpp index 10bab529..bac932e5 100755 --- a/LightPadSynth/source/version.hpp +++ b/LightPadSynth/source/version.hpp @@ -16,11 +16,11 @@ #define SUB_VERSION_STR "1" #define SUB_VERSION_INT 1 -#define RELEASE_NUMBER_STR "24" -#define RELEASE_NUMBER_INT 24 +#define RELEASE_NUMBER_STR "25" +#define RELEASE_NUMBER_INT 25 -#define BUILD_NUMBER_STR "24" -#define BUILD_NUMBER_INT 24 +#define BUILD_NUMBER_STR "25" +#define BUILD_NUMBER_INT 25 #define FULL_VERSION_STR \ MAJOR_VERSION_STR "." SUB_VERSION_STR "." RELEASE_NUMBER_STR "." BUILD_NUMBER_STR diff --git a/SyncSawSynth/source/dsp/dspcore.cpp b/SyncSawSynth/source/dsp/dspcore.cpp index ef7d75ab..2881f3e4 100644 --- a/SyncSawSynth/source/dsp/dspcore.cpp +++ b/SyncSawSynth/source/dsp/dspcore.cpp @@ -485,7 +485,6 @@ void DSPCore::noteOn(int32_t noteId, int16_t pitch, float tuning, float velocity size_t mostSilent = 0; float gain = 1.0f; for (; i < nVoice; ++i) { - if (notes[i][0]->id == noteId) break; if (notes[i][0]->state == NoteState::rest) break; if (!notes[i][0]->gainEnvelope.isAttacking() && notes[i][0]->gain < gain) { gain = notes[i][0]->gain; @@ -566,12 +565,17 @@ void DSPCore::noteOn(int32_t noteId, int16_t pitch, float tuning, float velocity void DSPCore::noteOff(int32_t noteId) { - size_t i = 0; - for (; i < notes.size(); ++i) { - if (notes[i][0]->id == noteId) break; + // size_t i = 0; + // for (; i < notes.size(); ++i) { + // if (notes[i][0]->id == noteId) break; + // } + // if (i >= notes.size()) return; + + // notes[i][0]->release(); + // notes[i][1]->release(); + + for (auto &x : notes) { + if (x[0]->id == noteId) x[0]->release(); + if (x[1]->id == noteId) x[1]->release(); } - if (i >= notes.size()) return; - - notes[i][0]->release(); - notes[i][1]->release(); } diff --git a/SyncSawSynth/source/dsp/envelope.hpp b/SyncSawSynth/source/dsp/envelope.hpp index 7da86b6e..26bb4cde 100644 --- a/SyncSawSynth/source/dsp/envelope.hpp +++ b/SyncSawSynth/source/dsp/envelope.hpp @@ -43,9 +43,10 @@ template class ExpADSREnvelope { Sample declickTime = Sample(0.001), Sample threshold = Sample(1e-5)) { + if (state == State::terminated) sustain.reset(sustainLevel); state = State::attack; + value = threshold; - sustain.reset(sustainLevel); set(attackTime, decayTime, sustainLevel, releaseTime, declickTime, threshold); } @@ -107,12 +108,12 @@ template class ExpADSREnvelope { releaseRange = value - value * sustain.getValue() + sustain.getValue(); break; - case State::terminated: - return; - - default: + case State::sustain: releaseRange = sustain.getValue(); break; + + default: + return; } value = Sample(1.0); diff --git a/SyncSawSynth/source/plugprocessor.cpp b/SyncSawSynth/source/plugprocessor.cpp index 60ded06e..9c10304f 100644 --- a/SyncSawSynth/source/plugprocessor.cpp +++ b/SyncSawSynth/source/plugprocessor.cpp @@ -121,17 +121,17 @@ void PlugProcessor::handleEvent(Vst::ProcessData &data) // List of DAW that doesn't support note ID. Probably more. // - Ableton Live 10.1.6 // - PreSonus Studio One 4.6.1 + auto noteId + = event.noteOn.noteId == -1 ? event.noteOn.pitch : event.noteOn.noteId; dsp.pushMidiNote( - true, event.sampleOffset, - event.noteOn.noteId == -1 ? event.noteOn.pitch : event.noteOn.noteId, - event.noteOn.pitch, event.noteOn.tuning, event.noteOn.velocity); + true, event.sampleOffset, noteId, event.noteOn.pitch, event.noteOn.tuning, + event.noteOn.velocity); } break; case Vst::Event::kNoteOffEvent: { - dsp.pushMidiNote( - false, event.sampleOffset, - event.noteOff.noteId == -1 ? event.noteOff.pitch : event.noteOff.noteId, 0, 0, - 0); + auto noteId + = event.noteOff.noteId == -1 ? event.noteOff.pitch : event.noteOff.noteId; + dsp.pushMidiNote(false, event.sampleOffset, noteId, 0, 0, 0); } break; // Add other event type here. diff --git a/SyncSawSynth/source/version.hpp b/SyncSawSynth/source/version.hpp index 52a21c4b..07401817 100644 --- a/SyncSawSynth/source/version.hpp +++ b/SyncSawSynth/source/version.hpp @@ -16,11 +16,11 @@ #define SUB_VERSION_STR "1" #define SUB_VERSION_INT 1 -#define RELEASE_NUMBER_STR "29" -#define RELEASE_NUMBER_INT 29 +#define RELEASE_NUMBER_STR "30" +#define RELEASE_NUMBER_INT 30 -#define BUILD_NUMBER_STR "29" -#define BUILD_NUMBER_INT 29 +#define BUILD_NUMBER_STR "30" +#define BUILD_NUMBER_INT 30 #define FULL_VERSION_STR \ MAJOR_VERSION_STR "." SUB_VERSION_STR "." RELEASE_NUMBER_STR "." BUILD_NUMBER_STR diff --git a/TestBedSynth/source/dsp/dspcore.cpp b/TestBedSynth/source/dsp/dspcore.cpp index 96364cfe..c6ed0b02 100644 --- a/TestBedSynth/source/dsp/dspcore.cpp +++ b/TestBedSynth/source/dsp/dspcore.cpp @@ -318,7 +318,6 @@ void DSPCore::noteOn( // Pick up note from resting one. for (size_t index = 0; index < nVoice; ++index) { - if (notes[index].id == noteId) noteIndices.push_back(index); if (notes[index].state == NoteState::rest) noteIndices.push_back(index); if (noteIndices.size() >= nUnison) break; } diff --git a/TestBedSynth/source/version.hpp b/TestBedSynth/source/version.hpp index 79585340..02ec43f4 100644 --- a/TestBedSynth/source/version.hpp +++ b/TestBedSynth/source/version.hpp @@ -16,11 +16,11 @@ #define SUB_VERSION_STR "0" #define SUB_VERSION_INT 0 -#define RELEASE_NUMBER_STR "5" -#define RELEASE_NUMBER_INT 5 +#define RELEASE_NUMBER_STR "6" +#define RELEASE_NUMBER_INT 6 -#define BUILD_NUMBER_STR "5" -#define BUILD_NUMBER_INT 5 +#define BUILD_NUMBER_STR "6" +#define BUILD_NUMBER_INT 6 #define FULL_VERSION_STR \ MAJOR_VERSION_STR "." SUB_VERSION_STR "." RELEASE_NUMBER_STR "." BUILD_NUMBER_STR diff --git a/docs/manual/ClangSynth/ClangSynth.json b/docs/manual/ClangSynth/ClangSynth.json index d261f19c..2d3897f0 100644 --- a/docs/manual/ClangSynth/ClangSynth.json +++ b/docs/manual/ClangSynth/ClangSynth.json @@ -1,8 +1,9 @@ { "ClangSynth": { - "latest_version": "0.1.9", + "latest_version": "0.1.10", "urls": { "plugin_url": [ + "https://github.com/ryukau/VSTPlugins/releases/download/UhhyouPlugins0.65.0/ClangSynth_0.1.10.zip", "https://github.com/ryukau/VSTPlugins/releases/download/UhhyouPlugins0.61.0/ClangSynth_0.1.9.zip", "https://github.com/ryukau/VSTPlugins/releases/download/UhhyouPlugins0.59.0/ClangSynth_0.1.8.zip", "https://github.com/ryukau/VSTPlugins/releases/download/UhhyouPlugins0.55.0/ClangSynth_0.1.7.zip", @@ -17,6 +18,14 @@ "preset_url": "https://github.com/ryukau/VSTPlugins/releases/download/UhhyouPlugins0.53.0/ClangSynthPresets.zip" }, "changelog": { + "0.1.10": { + "en": [ + "Changed to reduce click at note-on when a note number is repeatedly played. This happened when proper note IDs are not provided from DAW. Bitwig, Live, REAPER are affected." + ], + "ja": [ + "DAW から適切なノート ID が提供されないときに、同音連打するとノートオンで生じていたクリックを低減。 Bitwig, Live, REAPER での使用時に影響あり。" + ] + }, "0.1.9": { "en": [ "Fixed GUI on Linux." diff --git a/docs/manual/ClangSynth/ClangSynth_en.html b/docs/manual/ClangSynth/ClangSynth_en.html index 1c9870bd..b0562e5f 100644 --- a/docs/manual/ClangSynth/ClangSynth_en.html +++ b/docs/manual/ClangSynth/ClangSynth_en.html @@ -5,7 +5,7 @@ - + ClangSynth_en – Uhhyou Plugins @@ -285,7 +285,7 @@

Back to Index

- Update: 2024-09-28 + Update: 2024-11-16

Table of Contents @@ -393,15 +393,15 @@