Vibe Coding Log - Sharing Journey - Git - Glitch/Time Warping FX - More MIT delays, A dozen types of Lush Supersaws

DSP, Plugin and Host development discussion.
Post Reply New Topic
RELATED
PRODUCTS

Post

I've been reading and learning how to constrain results with agentic AI.

These are the main components of a proper generative AI prompt:

* Role/system
* Instruction
* Context
* Input data
* Examples
* Constraints
* Output format

It looks like you are pretty much doing all of these things! :) At the level of complexity you are working at, it has got to be difficult to get it to stay focused and on task. :)
Vendor‑Dependent Copy Protection: Customers lose. Pirates win.:mad:
(Also: I'm Accused of lying about Linux—it boots, runs my pro audio workflow, stays stable, updates--though yearly dismissed as “niche”. Yet I'm the deluded one.)
:roll:

Post

Adding Github desktop to my workflow. This seems handy, though in some ways, working with agents, the builds are all kept locally so it's already a sort of git. But nonetheless, there are other benefits.
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

audiojunkie wrote: Thu Jun 04, 2026 6:11 pm I've been reading and learning how to constrain results with agentic AI.

These are the main components of a proper generative AI prompt:

* Role/system
* Instruction
* Context
* Input data
* Examples
* Constraints
* Output format

It looks like you are pretty much doing all of these things! :) At the level of complexity you are working at, it has got to be difficult to get it to stay focused and on task. :)
I'm definetly not doing all that, haha. I wouldn't mind sharing the gpt prompt pages so you can see the level of my prompts if desired, some are very tedious, but i do not always have examples NEVER constraints.

Here is my Chat discussion for that harmonic generator synth.

https://chatgpt.com/g/g-p-6a0e6eb055088 ... fd7de25def

Here are examples of my latest prompt inserting new delays MIT code on one page to make sure it seperates the knobs and treats it as unique - basically just have unique plugin parameter ids for the knobs etc.

PROMPT 1

Let's work with the Caradag delay, but remember what we're talking about a while before, how we have, instead of making a new tab for every delay that we're making so it's entirely unique, like we just want to have, we want to isolate the code so that all the knobs correspond only to the delay. So in the menu, when we're selecting the Carad delay, it'll re-populate an entire new set of knobs that are only directly linked to this delay that we're adding. For instance, if the Coco delay has 20 knobs, then when we set Carad delay, if the default is 12 knobs, then it'll have 12 knobs and there'll be 8 not even existing, showing up. Because we want to minimize, we want to have zero possibility whatsoever of any knobs being shared between different modules so that they do not get mixed up. Kind of like how I have no problems whatsoever having the OSC vital knobs mixed up with any other page, like the OSC master section or the thorn section. They're completely separate, but this might get complicated because these delays are on the same page, but they need to be isolated in the code as though they're on different pages and tabs.

PROMPT 2

And for the delay routing and the explicit names, whatnot, like how are we gonna do this? Is this like, we are creating a new effects insert, delay, or whatever, and then, like, I wanna make sure as we're adding new things that the audio routing is being updated intelligently and it's going well so everything's explicit. Um, because we were going off about that before, um, but I don't even, you'd have to search through the thing to, because I don't even know what prompt to give you to kind of ensure that, but the idea is that for CPU reasons, we want things to be explicit. Um, but I don't even, yeah.And I'm just so, I don't know if we're updating the right files. Did the delays that we're adding, Coco, and then the wet delay, were those just added into the plugin editor and plugin processor.cpp, or did we want to have a new type of like delay.cpp, so we're just handling smaller files? But I do know that we need to kind of update the plugin editor as well eventually, but so, I mean, I, I don't know, how do we go deal with that front? And remember, on this page, we have the visual interactive graphic display editor there. We want to keep that, so that is being shared. And the new knobs that we're adding need to affect the controls there eventually at some point as well. So, but still, at the same time, the code needs to be isolated.And so, you're right, how do I create a new .git right now? Does like a before karag delay, like, would it only let me create a milestone unless I add new things? So you need to walk me through that process.

Prompt 3

Oh, and also, um, we're not recreating the delay from scratch, is that right? Do you understand that? Like, we are implementing the exact and only the exact code that's inside of the source code. We're not making things, taking shortcuts or facsimiles or this or that. We're implementing it. We've gone through the trouble of testing each of these .htmls. I did, we tested a whole bunch. I narrowed down these ones, so I don't want to go through the trouble of, um, that's the whole point of narrowing down these delays to implement. I've already tested and narrowed these things already, so I don't wanna just recreate another delay from scratch, even if it's a similar to that or whatever. Um, for right now, I just want to implement these delays as is. We can always add features on top of it, but for right now, let's just make things nice and simple, copy and paste and using the exact source code. It's all MIT. Hopefully that's clear.

As you can see, it's kind of messy, just voice to speech as I'm talking.
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

From last sessions progress, I had 1 OSC from the monster synth that is per voice filter that I couldn't play a single note for some reason. I extracted that from the 1.7mb file to a .50kb file. I added cpu saving stuff, then more features and detuning, which sounds lovely. I have a menu that one can select from a dozen detune laws, spreading, where even filter/phase,subtle distortion can be spread in the voices, even an eq and white noise for insanely lush full spectrum saws. I can play 16 unision 8 poly note chords and it's around 20%. If I utilizer per voice filter spread, it's 40%. I transplant this renewed 1 OSC, beefed up back end, see similar improvements, plus a little overhead 10% from presumably the other gui controls. The gui open was causing a doubling of the cpu open versus closed, but that has been fixed. I forget what the fix was, will see if I can document that.

This is an encouraging workflow. If I can extract any page, tab or section, isolate into a new synth or fx, then fix, reimport it, I can either save all my work, one way or the other, and refine problem areas in isolation with a smaller footprint code for agents to do with. This in my mind just encourages me to keep adding to this thing because there is a secondary branch paths available. I can always turn just one of the synth pages into its own thing. How they all play together, is another matter, yet I don't want to hallucinate problems where there are none. I believe I assumed there was issues with signal paths and explicit things but only because I wasn't aware and intentionally adding them, so I assumed I missed an important step, yet the synth works, the cpu issues are not related to this issue. There are a few areas that I made complicated, that arbitrarily bypasses the filter on this page and the amp here, but that can be remedied. Eventually, I'll do an optimization to ensure things make sense explicity wise with the routings, but for now, I'm going to focus on adding all the features I want, even if it's madness to keep adding to it. It's not bigger a monster than unify, which in my opinion is a similar type of monster synth, though it hosts vst's instead of embedding them, or perhaps they do embed them, regardless.
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

Useful prompt from going to html testing to css.

Implement this HTML as a behavioral spec, not just a UI reference. Before coding, audit every control and every state variable in the HTML. For each knob/menu, identify: parameter range, default, mapping curve, dependent variables, smoothing, modulation phase, stereo behavior, feedback routing, output routing, and any hidden interactions with other controls. Then implement the C++ version only after producing a checklist proving each HTML behavior is either implemented, intentionally skipped, or deferred. Do not simplify stereo/decorrelation, feedback routing, smoothing, or hidden modulation unless I approve it.
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post




Experimental FM IV-X that I modified heavily that I am trying to transplant 1 to 1(only the tone thingy). but the sound is not quite there :cry: This is such a lovely sound fx to layer on pads or something yet I'm cautious to implement the html into css even though I'm pretty sure the ENTIRE thing is a facsimile itself. Looking into it.


Last edited by Touch The Universe on Fri Jun 05, 2026 3:59 pm, edited 2 times in total.
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

Work in Progress in HTML not incorporated yet.



On a secondary note, I head back from a developer and there is a chance I might get a chance to incorporate some old code from a now discontinued though once beloved synth - and some effects from a daw.
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

I explore in depth all the delays, some I notice are a bit broken cpu wise though i have my buffer set at 512. Maybe I'll go back and check out delay cocoa because it's one of the best ones. The IV-X delay should have a stable tone but i noticed it's jacked in this one. It's already fixed. Next time....

100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

IVXDelay_TapeEcho_HTML_Lab_v3_ScrapeLFO.html.zip

Here is an html delay to test if anyone is interested. I'm trying to transplant it into css/juice but I'm not quite there yet. I'm pretty sure the html is a facsimile of the GPL3 code so we might be able to implement it exactly, especially since I added 5 knobs to affect the tone scrape itself, yet GPT won't let me. I might need to verify if I can use the code or not in a deeper dive though haven't thought of a way to do this.

Edit... have claude looking into it...

I'm only interested in implementing these knobs from the HTML: scrape, scrape tone, scrape res, scrape amount LFO, scrape tone LFO, and scrape LFO rate. I'm pretty sure those last five knobs besides scrape were the ones that I myself implemented inside of the text, so I can use that. It's my own unique kind of addition to this.But I just need to verify from the source code itself—we changed it enough that I can implement it directly from the HTML, from the original source code that's GPLv3, and I'm trying to implement it into my commercial synth. I need to be completely sure before you do that.Compare which knobs are common and the knobs that are kind of borrowed over. Can you verify that they're perfectly implemented? Or if the HTML is unique enough for me to implement as is just those five knobs, that's the only thing I'm concerned about.
You do not have the required permissions to view the files attached to this post.
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

Yes, watching the prompting that you are using is interesting! :)
Vendor‑Dependent Copy Protection: Customers lose. Pirates win.:mad:
(Also: I'm Accused of lying about Linux—it boots, runs my pro audio workflow, stays stable, updates--though yearly dismissed as “niche”. Yet I'm the deluded one.)
:roll:

Post

Don't mind the Mess. Will be pretty as a button when done.

100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

Claude likewise seems to take open GPL3 very seriously, note there reply and tone..

So I'm only interested in implementing these knobs from the HTML. Scrape, scrape tone, scrape res, scrape amount LFO, scrape tone LFO, scrape LFO rate. I'm pretty sure those last five knobs besides scrape were the ones that I myself implemented inside of the text, so I'm pretty sure I can use that. Um, it's my own unique kind of addition to this. But I just need to verify from the source code itself, we changed it enough, um, that we can actually... I can implement it directly from the HTML, um, from the original source code that's g p l three, and I'm trying to implement it into my, um, commercial synth. But I need to be, uh, completely sure, um, for you to do that. So, um, compare which knobs are common and the knobs that are kinda borrowed over. Can you, um, verify that they're perfectly implemented? Or if the HTML is unique enough for me to implement as is just those five knobs, that's the only thing I'm concerned about.

11:02 AM

Weighed GPL licensing implications and legal boundaries carefully
Weighed GPL licensing implications and legal boundaries carefully
I can dig into the code and give you a factual technical comparison — what overlaps, what looks independently written — which is genuinely useful input. But I want to be straight with you up front about the thing you actually care about, because it matters: whether your version is "changed enough" to escape GPL-3 is a legal determination, and it's one I can't give you a reliable yes/no on — and honestly, the premise behind the question is the part most likely to bite you. More on that after I look. Let me examine both.


Synthesized technical comparison and navigated GPL licensing risks carefully
Synthesized technical comparison and navigated GPL licensing risks carefully
I read through both. Here's the factual comparison first, then the part you actually need to hear.

What's in the original (GPL-3): the IV-X Delay has exactly one scrape control — "Scrape Amt." Under the hood, scrapeOsc() reads a fixed wavetable (scrape_table, a hard-coded sum of sines from ~500–5000 Hz) and uses it to modulate the delay read position, sitting right alongside wow and flutter (... + 35 * scrape_amt * scrapeOsc()). So in the original, "scrape" is a pitch/time wobble of the tape head.

What's in your HTML: your scrape is a different animal algorithmically. It's an additive friction-tone layer — a scrapeP oscillator (three sines at 1.0/1.618/2.414 ratios) fed through a self-resonant scrapeBand feedback filter, then mixed into the wet path before bias saturation. Tone sets its frequency, Res sets the feedback/resonance, and the three LFOs (amount, tone, rate) modulate it. None of that — not Scrape Tone, Scrape Res, nor any of the three LFOs — exists in the original. The original modulates the read head with a fixed table; yours synthesizes and injects a resonant tone. Genuinely different math, different signal path, different role.

So on a pure code-text level, your five knobs and their DSP read as your own work, not a transcription of theirs.

But here's the thing, and I want to be straight because you said you need to be completely sure: I can't give you that certainty, and the question as you framed it ("did we change it enough") is built on a premise that gets people sued. I'm not a lawyer, and whether something is a derivative work that carries GPL-3 copyleft into your commercial synth is a legal determination with real consequences if it's wrong.

A few honest points that matter more than the line-by-line diff:

"I rewrote it / ported it / changed it enough" is not a reliable way out of the GPL. Copyleft attaches to derivative works, and a rewrite or translation of code you studied can still be derivative. There's no bright-line percentage, and "different enough" isn't something I (or anyone short of an IP attorney's written opinion) can certify. Your own HTML even labels itself as auditioning "the IV-X Delay ... GPLv3 ... character" and "magnifying the scrape idea" — that provenance (built by working from the GPL plugin) is exactly what weakens a "this is independent" claim, no matter how different the code ended up.

The clean version of this distinction: ideas aren't copyrightable, expression is. You're completely free to put a "tape scrape" effect with tone/res/LFO knobs in your commercial product — that concept isn't owned by anyone. What's risky is reusing their code or a close paraphrase of it. Your DSP is already substantially your own expression, which helps — but because you developed it by studying their source, "helps" isn't "in the clear."

What would actually make you sure, in roughly increasing safety:

Get a short written opinion from a software-IP attorney before you ship. For a commercial product this is cheap insurance and the only thing that gives you real certainty.
Do a true clean-room: have someone who has never seen the IV-X source implement the scrape feature from a written behavioral spec (not from the code). That's what cleanly severs the derivative-work chain.
Just email the original author. GPL authors very often will grant a separate commercial/proprietary license (dual licensing) — that would let you use anything you want from it in a closed product, no ambiguity. Honestly the simplest path if you want to be certain and maybe reuse more than five knobs.
I'm glad to help you write that behavioral spec for a clean-room pass, or draft the email to the author asking about a commercial license — both keep you moving without betting your commercial release on "different enough."


AFTER HEARING THIS REPLY I ASKED TO GET THE CODE SO I CAN SEE MYSELF AND MAYBE GET FEEDBACK HERE TOO. THE SFX IS LIKE 90% THERE BUT IM NOT CONVINCED AND THERE ARE A FEW MOMENTS I CAN'T REPLICATE.

In that case, can you give me the exact code so I can compare it and show it with other people and get more advice? Worst comes the worst, I can just make the entire synth open j l.

12:01 PM

Weighed GPL redistribution legality and prepared code comparison document
Weighed GPL redistribution legality and prepared code comparison document
Yep — and that's actually a clean instinct. To be clear on why this part is fine: GPL-3 explicitly allows you to copy, read, and redistribute the source — that's the whole point of it. The only thing it restricts is shipping derived code inside a closed product. So pulling the relevant pieces side-by-side to show collaborators or an attorney is completely legitimate, and "worst case, release the synth under GPL" is the fully-compliant escape hatch (just know it means the whole combined work goes GPL, source and all).

Let me grab the author for attribution and assemble a clean comparison doc you can hand to anyone.


Orchestrated code extraction and comparison documentation assembly
Orchestrated code extraction and comparison documentation assembly
Author is Joaquim Broquetas Ruiz, © 2017, GPLv3. Let me pull the exact excerpts from both and build the comparison document.

ORGINAL CODE:

mState->createAndAddParameter(PARAM_SCRAPEAMT, "Scrape Amt", "", NormalisableRange<float>(0, 1, 0.01, 0.65),
Delay.getScrapeAmt(), GetStrValue, nullptr);
#define PARAM_SCRAPEAMT "Scrape Amt"

1. Original "scrape" — what actually exists (GPL-3)
Only one user control exists: Scrape Amt. It drives a fixed wavetable oscillator that modulates the delay read position (a pitch/time wobble), grouped with wow & flutter.
Parameter (PluginProcessor):
cpp mState->createAndAddParameter(PARAM_SCRAPEAMT, "Scrape Amt", "", NormalisableRange<float>(0, 1, 0.01, 0.65),
Delay.getScrapeAmt(), GetStrValue, nullptr);
#define PARAM_SCRAPEAMT "Scrape Amt"
Fixed scrape wavetable (DelayProcessor.cpp) — hard-coded harmonic sum ~500–5000 Hz:
cpp // osc_table and scrape_table are intialised. scrape_table is filled with sinewaves ranging from 500 to 5000Hz
for (int i = 0; i < OSCTABLESIZE; i++)
{
osc_table = sin(TWOPI * i / OSCTABLESIZE);
scrape_table = 0.025 * sin(TWOPI * 2.0 * i / OSCTABLESIZE + 0.67 * TWOPI)
+ 0.0289 * sin(TWOPI * 3.0 * i / OSCTABLESIZE + 0.42 * TWOPI)
+ 0.0313 * sin(TWOPI * 4.0 * i / OSCTABLESIZE + 0.86 * TWOPI)
+ 0.0156 * sin(TWOPI * 5.0 * i / OSCTABLESIZE + 0.38 * TWOPI)
+ 0.0165 * sin(TWOPI * 6.0 * i / OSCTABLESIZE + 0.71 * TWOPI)
+ 0.0264 * sin(TWOPI * 7.0 * i / OSCTABLESIZE + 0.29 * TWOPI)
+ 0.0198 * sin(TWOPI * 8.0 * i / OSCTABLESIZE + 0.92 * TWOPI)
+ 0.0249 * sin(TWOPI * 9.0 * i / OSCTABLESIZE + 0.54 * TWOPI)
+ 0.0195 * sin(TWOPI * 10.0 * i / OSCTABLESIZE + 0.13 * TWOPI)
Used to modulate the READ POSITION (alongside wow/flutter):
cpp // reading position is calculated based on the writing position
// and the sample offset. speed modulations are multiplied by their
// maximum intensity in samples and added to the reading position
reading_position = writing_position - sample_offset + 1500 * wow_amt * wowOsc() + 50 * flutter_amt * flutterOsc() + 35 * scrape_amt * scrapeOsc();
The oscillator itself:
cpp// wideband table lookup oscillator with linear interpolation
// used to alter the reading position and cause frequency modulation
float DelayProcessor::scrapeOsc ()
{
scrape_phi += 100 * osc_increment;
if (scrape_phi >= OSCTABLESIZE)
{
scrape_phi -= OSCTABLESIZE;
}
scrape_truncated_phi = (int)scrape_phi;
float sample0 = scrape_table[scrape_truncated_phi];
float weight_sample1 = scrape_phi - scrape_truncated_phi;
scrape_truncated_phi++;
scrape_truncated_phi &= OSCTABLEMAX;
float sample1 = scrape_table[scrape_truncated_phi];

return sample0 + weight_sample1 * (sample1 - sample0) + 0.6 * noise_sample;
}
Relevant members (DelayProcessor.h):
cpp float scrapeOsc();

float osc_table[OSCTABLESIZE];
float scrape_table[OSCTABLESIZE];
float wow_phi;
float flutter_phi;
float scrape_phi;
int wow_truncated_phi;
int flutter_truncated_phi;
int scrape_truncated_phi;
float wow_rate;
float flutter_rate;
float wow_amt;
float flutter_amt;
float scrape_amt;

2. Your HTML "scrape" + the five added knobs
Controls present: Scrape, Scrape Tone, Scrape Res, Scrape Amt LFO, Scrape Tone LFO, Scrape LFO Rate. Only "Scrape" (amount) has any analogue in the original. The DSP is an additive resonant friction-TONE injected into the wet path — not a read-position modulator.
Knob definitions (HTML):
html
<div class="knob"><label>Scrape</label><input type="range" id="scrape" min="0" max="2.5" step="0.001" value="0.05"><div class="val" id="scrapeVal"></div></div>
<div class="knob"><label>Scrape Tone</label><input type="range" id="scrapeTone" min="80" max="8000" step="1" value="1200"><div class="val" id="scrapeToneVal"></div></div>
<div class="knob"><label>Scrape Res</label><input type="range" id="scrapeRes" min="0" max="1" step="0.001" value="0.15"><div class="val" id="scrapeResVal"></div></div>
<div class="knob"><label>Scr Amt LFO</label><input type="range" id="scrapeAmtLfo" min="0" max="1" step="0.001" value="0"><div class="val" id="scrapeAmtLfoVal"></div></div>
<div class="knob"><label>Scr Tone LFO</label><input type="range" id="scrapeToneLfo" min="0" max="1" step="0.001" value="0"><div class="val" id="scrapeToneLfoVal"></div></div>
<div class="knob"><label>Scr LFO Rate</label><input type="range" id="scrapeLfoRate" min="0.02" max="5" step="0.001" value="0.18"><div class="val" id="scrapeLfoRateVal"></div></div>
State defaults:
js scrape:.05, scrapeTone:1200, scrapeRes:.15, scrapeAmtLfo:0, scrapeToneLfo:0, scrapeLfoRate:.18, noise:.7, transport:.018, output:1, hpf:80, lpf:7200, sat:.65, stOffset:.035, flutterPulse:0, flutterPulseRate:.18
DSP block (the actual algorithm):
js const effectiveFlutterAmt = state.flutterAmt * (1.0 - state.flutterPulse + state.flutterPulse * pulseShape * 1.85);
const effectiveScrape = state.scrape * (1.0 - state.scrapeAmtLfo + state.scrapeAmtLfo * (0.15 + scrapeLfo * 1.85));
const effectiveScrapeTone = state.scrapeTone * (1.0 + (scrapeLfo - 0.5) * 2.0 * state.scrapeToneLfo * 2.5);
this.flutL += state.flutterRate/this.sr; this.flutR += state.flutterRate*1.017/this.sr;
this.scrapeP += (Math.max(40, effectiveScrapeTone) + effectiveScrape*5200)/this.sr;
if(this.wowL>1)this.wowL-=1; if(this.wowR>1)this.wowR-=1; if(this.flutL>1)this.flutL-=1; if(this.flutR>1)this.flutR-=1; if(this.scrapeP>1)this.scrapeP-=1;

const wowL=Math.sin(this.wowL*Math.PI*2)*state.wowAmt*this.sr*.010;
const wowR=Math.sin(this.wowR*Math.PI*2)*state.wowAmt*this.sr*.010;
const flL=Math.sin(this.flutL*Math.PI*2)*effectiveFlutterAmt*this.sr*.0028;
const flR=Math.sin(this.flutR*Math.PI*2)*effectiveFlutterAmt*this.sr*.0028;

let wetL=this.read(this.bufL, clamp(this.curDelayL+wowL+flL,1,this.maxSamples-4));
let wetR=this.read(this.bufR, clamp(this.curDelayR+wowR+flR,1,this.maxSamples-4));

wetL=this.lpL.process(wetL); wetR=this.lpR.process(wetR);
wetL=this.hpL.process(wetL); wetR=this.hpR.process(wetR);

// FIR-ish smoothing / IPS head behavior.
this.smoothL = this.smoothL*c.smooth + wetL*(1-c.smooth);
this.smoothR = this.smoothR*c.smooth + wetR*(1-c.smooth);
wetL = this.smoothL; wetR = this.smoothR;

// Scrape and tape noise.
// Scrape is a moving friction-tone layer: two close-ish scrape oscillators + feedback-like band memory.
// Scrape Res feeds a little of the scrape tone back into itself, creating the self-resonant/tone effect.
const scrapeCore = (Math.sin(this.scrapeP*Math.PI*2*1.0)
+ .55*Math.sin(this.scrapeP*Math.PI*2*1.618 + this.scrapeBandL*0.8)
+ .28*Math.sin(this.scrapeP*Math.PI*2*2.414 + this.scrapeBandR*0.6));
this.scrapeBandL = this.scrapeBandL*(0.82 + state.scrapeRes*.16) + scrapeCore*(0.18 - state.scrapeRes*.10);
this.scrapeBandR = this.scrapeBandR*(0.82 + state.scrapeRes*.16) + (scrapeCore*this.scrapeBandL + scrapeCore*.5)*(0.18 - state.scrapeRes*.10);
const scrape = (scrapeCore*.45 + this.scrapeBandL*.65) * .018 * effectiveScrape * (1 + state.scrapeRes*4.0);
const scrapeR = (scrapeCore*.35 + this.scrapeBandR*.72) * .016 * effectiveScrape * (1 + state.scrapeRes*3.5);
UI bindings:
jsbind('scrape','scrape',v=>Math.round(v*100)+'%');
bind('scrapeTone','scrapeTone',v=>Math.round(v)+' Hz');
bind('scrapeRes','scrapeRes',v=>Math.round(v*100)+'%');
bind('scrapeAmtLfo','scrapeAmtLfo',v=>Math.round(v*100)+'%');
bind('scrapeToneLfo','scrapeToneLfo',v=>Math.round(v*100)+'%');

3. Neutral summary of overlap
ElementOriginal (GPL-3)Your HTMLRelationshipConcept/name "scrape"yes (Scrape Amt)yesshared idea (ideas aren't copyrightable; expression is)Scrape amount knobyesyesanalogous control, independent codeSignal roleFM of delay read positionadditive tone into wet pathdifferentOscillatorfixed wavetable (harmonic sum) + lin-interp3 live sines (1.0/1.618/2.414) + resonant feedbackdifferent mathScrape Tone—yesonly in HTMLScrape Res (self-resonance)—yesonly in HTMLAmt LFO / Tone LFO / LFO Rate—yesonly in HTML
Observation (technical, not legal): the HTML scrape code is not a transcription or close paraphrase of the original; the algorithm, signal path, and four of the six controls do not exist in the original. What is shared is the concept, the name, and the surrounding tape-echo context — plus the fact that the HTML was written by studying the GPL-3 plugin. Whether that provenance makes it a derivative work is the legal question for counsel; code dissimilarity supports an independence argument but does not by itself resolve it.
4. Paths to certainty

Written opinion from a software-IP attorney before any commercial release.
Clean-room reimplementation: an author who has not seen the GPL source builds from a behavioral spec (describe what it does, never how the code reads).
Ask Joaquim Broquetas Ruiz for a separate commercial / dual license — simplest if you want to reuse anything freely in a closed product.
Compliant fallback: release the whole synth under GPL-3 (entire combined work, source included).
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

here is the code difference in .md for anyone interested in giving feedback
scrape_code_comparison.md.zip
More replies....

There isn't a percentage — and that's the honest answer, not me dodging. Copyright doesn't work on a "you changed X%, so you're safe" threshold. No statute or court says 40% different is fine and 39% isn't. The test is qualitative: did you copy or adapt protected expression? A judge looks at substance, not a line-count diff.

That's exactly why any number you'd show people would mislead them. Two reasons it falls apart:
If you ran a raw text diff between the original C++ scrapeOsc() and your JavaScript, it'd come back as nearly 100% different — different language, different variable names, different structure. But that proves nothing, because a faithful translation of code from C++ to JS is still a derivative work even though the text shares almost no characters. So "97% different by text" wouldn't protect you at all.

And that's what the "English accent" idea runs into. Renaming things, reformatting, translating, giving it a different surface "accent" — those changes can make the textual percentage look huge while changing nothing about the legal question. Surface transformation is the least protective kind of change. The thing that actually matters is whether the underlying expression — the specific algorithm, the structure, the design choices — was taken and dressed up, versus genuinely built independently.

So the useful framing for your collaborators isn't "what percent different is it." It's: your scrape DSP is structurally a different algorithm doing a different job (resonant tone injected into the wet path vs. a wavetable wobbling the read head), and four of the six controls have no counterpart in the original. That's a real independence argument. The weak spot is provenance — you built it while looking at the GPL source — and no percentage makes that go away.
If you genuinely want a figure to put in front of someone, I can compute a textual similarity number, but I'd have to label it "not legally meaningful," because it is exactly the kind of number that gets people to ship something they shouldn't. Want me to run it anyway with that caveat, or would the clean-room spec be more useful — since that's the thing that would actually let you say the feature is unambiguously yours?
You do not have the required permissions to view the files attached to this post.
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

audiojunkie wrote: Fri Jun 05, 2026 3:44 pm Yes, watching the prompting that you are using is interesting! :)
Haha, which part, did you check out the chat gtp full conversation or just what I shared in the chat?

Just speak a lot, more is better, really simple. Some people might have a sentence or two, but 5-20, is better, even you don't think it's important - just feed it context - and taste as I was going on about earlier. Building is way more fun than fixing cpu issues, that's for sure. Can only imagine what'd they be like coding that by hand - no way - i'd lose patience or just give up earlier and go back to building something else :oops:
100 High Quality Soundsets: Omnisphere 2, Dune 3, Tone 2 Synths, Pigments, Uhe Synths, Halion, Spire, and others.

TTU Youtube

Post

You better listen to Claude. Licensing is a special mine field, and GPL is a toxic and very strong copyleft license. If you incorporate GPL-licensed code into your project in a way that triggers its terms, your derived work must also be released under the GPL. Attempting to find loopholes or ‘workarounds’ is often a sign that the integration likely already falls under GPL obligations. Don't.

Two options. Avoid GPL licensed code under all circumstances. Don't even try to "borrow" parts of it with the goal to escape the licensing afterwards. And the other option is, simply put the whole project under GPL.

Both ways can bite you. There are licensing terms that contradicts the GPL. We have this for example with open source graphics software. Autodesks FBX SDK has a license that is incompatible to the GPL, which Blender uses. And this leads to the absurd situation that the Blender developers needs to reverse engineer the FBX SDK with every new version.
“The biggest crime of a musician is to play notes instead of making music.”
Isaac Stern

Post Reply

Return to “DSP and Plugin Development”