Resultat 1 till 9 av 9

Ämne: SuperCollider (Wavefolders och Exponentiell FM)

  1. #1
    sonicaddiction
    sonicaddiction är inte uppkopplad
    sonicaddictions avatar
    Senior

    SuperCollider (Wavefolders och Exponentiell FM)

    Hej!
    Började kolla lite på SuperCollider härom veckan och har suttit senaste kvällarna och försökt koda ihop en egen tolkning av en Buchla 261e. Jag hittade en enklare wavefolder som bara viker en sinus när man ökar amplituden över +-1 och sen mjukar till kanterna lite, SmoothFoldS heter den, men den inbyggda Fold funkar också. Däremot undrar jag hur man kan få till de lite snyggare vikningen enligt den gröna bilden, istället för den vanliga vikningen där alla peakar till slut får nästan samma amplitud som på min gula.

    Klicka på bilden för en större version. 

Namn:	scope1.png 
Visningar:	10 
Storlek:	91,8 KB 
Id:	116834Klicka på bilden för en större version. 

Namn:	scope2.png 
Visningar:	12 
Storlek:	195,3 KB 
Id:	116835

    Sen undrar jag också hur jag får till exponentiell fm. Vanlig linjär antar jag är motsvarande: (primärFrekvens + modOscillator * modulationsindex), men hur tänker man vid exponentiell?

    Tack på förhand!

  2. #2
    jgb
    jgb är uppkopplad nu
    jgbs avatar
    Fjomp
    Just den "gröna" varianten borde gå att få till genom att addera lite av orginalsignalen tycker jag det ser ut som.

  3. #3
    sonicaddiction
    sonicaddiction är inte uppkopplad
    sonicaddictions avatar
    Senior
    Ja, just det, det ser jag nu också. Jag provar ikväll. Tack!

  4. #4
    sonicaddiction
    sonicaddiction är inte uppkopplad
    sonicaddictions avatar
    Senior
    Spånade vidare under lunchen:

    ModulationsOscillatorn borde gå att skriva typ:
    modOsc = SinOsc.ar(modFreq).bipolar(fmIndex).midiRatio * primaryOscFreq.

    Sen stoppar man bara in den i sin huvudoscillator:
    primaryOsc = SinOsc.ar(modOsc)

    Vid exempelvis fmIndex 12 får man följande:
    12.midiRatio är 2 och -12.midiRatio är 0.5. Multiplicerar man det värdet med en originalfrekvens på 100Hz får man en oscillation mellan 50Hz och 200Hz (en oktav ned och en oktav upp) vilket blir exponentiellt.


    ...eller tänker jag snett?


    SuperCollider är kul!
    Senast redigerat av sonicaddiction den 2024-02-09 klockan 14:00.

  5. #5
    oberdada
    oberdada är inte uppkopplad
    oberdadas avatar
    Veteran
    Jag har lite svårt att förstå sypercolliders syntax i det exemplet, men det stämmer ju att exponentiell FM ger lika stort utslag uppåt och neråd i oktaver eller cent, så du har nog gjort rätt.

    Här är några idéer för annat man kan göra med FM. Exponentiell FM och ett försök till exponentiell PM längst ner på sidan.

  6. #6
    sonicaddiction
    sonicaddiction är inte uppkopplad
    sonicaddictions avatar
    Senior
    Jag tror jag fick till nåt till slut i alla fall.
    En enklare drone-skiss med en komplex oscillator med exponentiell fm, wave folding med timbre-modulation.
    La på en filterbank också som man kan leka med för att forma ljudet ännu värre.
    Har ingen aning om ännu hur man strukturerar koden på ett bra sätt men här ska det bara vara att köra definitionerna, starta upp synth/filter och sen starta GUI:t. Öppen för kritik.

    Kod:
    // TODO:
    // * Randomize-buttons, randomizing parameters in some fun way
    // * Reverb-control
    // * Add some sort of LPG and envelopes
    // * Midi control
    
    
    s.boot;
    s.volume.gui;
    
    // How to run the synth:
    // 1. Run the synth definition and startup block
    // 2. Run the GUI block
    
    
    (
    // Define the synth and filter
    SynthDef(\complexOscillator, {
    	var sig;
    	var primaryOsc, primaryFreq;
    	var modFreq, modOsc;
    	var fold, foldIndex;
    	var freqOsc;
    
    	primaryFreq = \freq.kr(100);
    
    	// Modulating Oscillator
    	modFreq = primaryFreq * (2 ** \modFreq.kr(0));
    	modOsc = LFTri.ar(modFreq);
    
    	// FM
    	freqOsc = modOsc.bipolar(\fmIndex.kr(0)).midiratio * primaryFreq;
    
    	// Primary Oscillator
    	fold = \fold.ar(1).lag(0.2) + (modOsc.unipolar() * \foldIndex.kr(0));
    	primaryOsc = SinOsc.ar(freqOsc, 0, fold);
    
    	sig = SmoothFoldS.ar(primaryOsc, smoothAmount: \smooth.kr(0).lag(0.1));
    
    	sig = sig ! 2;
    	Out.ar(\out.kr(0), sig);
    }).add;
    
    SynthDef(\barkFilter, {
    	var sig, bands, filters, rq, filtered;
    	rq = \rq.kr(0.5);
    	sig = In.ar(\in.kr(0), 2);
    	filters = [
    		RLPF.ar(sig, 100, rq) * \amp0.kr(0.5),
    		BPF.ar(sig, 150, rq) * \amp1.kr(0.5),
    		BPF.ar(sig, 250, rq) * \amp2.kr(0.5),
    		BPF.ar(sig, 350, rq) * \amp3.kr(0.5),
    		BPF.ar(sig, 500, rq) * \amp4.kr(0.5),
    		BPF.ar(sig, 630, rq) * \amp5.kr(0.5),
    		BPF.ar(sig, 800, rq) * \amp6.kr(0.5),
    		BPF.ar(sig, 1000, rq) * \amp7.kr(0.5),
    		BPF.ar(sig, 1300, rq) * \amp8.kr(0.5),
    		BPF.ar(sig, 1600, rq) * \amp9.kr(0.5),
    		BPF.ar(sig, 2000, rq) * \amp10.kr(0.5),
    		BPF.ar(sig, 2600, rq) * \amp11.kr(0.5),
    		BPF.ar(sig, 3500, rq) * \amp12.kr(0.5),
    		BPF.ar(sig, 5000, rq) * \amp13.kr(0.5),
    		BPF.ar(sig, 8000, rq) * \amp14.kr(0.5),
    		RHPF.ar(sig, 10000, rq) * \amp15.kr(0.5),
    	];
    	filtered = Mix(filters);
    	sig = sig.blend(filtered, \mix.kr(1));
    	Out.ar(\out.kr(0), sig);
    }).add;
    
    SynthDef(\rev, {
    	var sig;
    	sig = In.ar(bus: \in.kr(0), numChannels: 2);
    	sig = FreeVerb.ar(sig, \mix.kr(0.15), \room.kr(0.5), \damp.kr(0.5));
    	Out.ar(\out.ir(0), sig)
    }).add;
    
    // Start up the synth and filter
    s.newBusAllocators;
    ~bus = ();
    ~bus.src = Bus.audio(s, 2);
    ~bus.barkFilter = Bus.audio(s, 2);
    ~bus.rev = Bus.audio(s, 2);
    ~rev = Synth(\rev, [in: ~bus.barkFilter, out: 0]);
    ~filter = Synth(\barkFilter, [in: ~bus.src, out: ~bus.barkFilter]);
    ~osc = Synth(\complexOscillator, [out: ~bus.src]);
    )
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    // Build the GUI
    (
    var win, primaryOscCtrl, modOscCtrl, sliders, foldCtrl, filterCtrl;
    win = Window.new("Complex oscillator", Rect(600, 700, 900, 250)).front.alwaysOnTop_(true);
    win.view.decorator_(FlowLayout(win.bounds, 20@20, 20@20));
    
    sliders = ();
    sliders.fmIndex = Slider.new().action_({
    	arg v;
    	~osc.set(\fmIndex, v.value);
    });
    
    primaryOscCtrl = CompositeView(win, 200@200).background_(Color.rand);
    primaryOscCtrl.layout_(GridLayout.columns(
    	[
    		Knob().action_({
    			arg v;
    			~osc.set(\freq, v.value.linexp(0, 1, 20, 2000));
    		}).valueAction_(0.2),
    		StaticText().string_('Primary Osc'),
    	],
    	[
    		Slider().action_({
    			arg v;
    			~osc.set(\fmIndex, v.value.linlin(0, 1, 0, 72));
    		}).valueAction_(0.1),
    		StaticText().string_('FM Index'),
    	]
    ));
    
    modOscCtrl = CompositeView(win, 100@200).background_(Color.rand);
    modOscCtrl.layout_(GridLayout.columns(
    	[
    		Knob().action_({
    			arg v;
    			~osc.set(\modFreq, v.value.linlin(0, 1, -4, 4));
    		}).valueAction_(0.5),
    		StaticText().string_('Mod Osc, rel to primary'),
    	],
    ));
    
    foldCtrl = CompositeView(win, 200@200).background_(Color.rand);
    foldCtrl.layout_(GridLayout.columns(
    	[
    		Slider().action_({
    			arg v;
    			~osc.set(\fold, v.value.linlin(0, 1, 1, 10));
    		}).valueAction_(0.1),
    		StaticText().string_('Fold'),
    	],
    	[
    		Slider().action_({
    			arg v;
    			~osc.set(\smooth, v.value);
    		}).valueAction_(0),
    		StaticText().string_('Smooth'),
    	],
    	[
    		Slider().action_({
    			arg v;
    			~osc.set(\foldIndex, v.value * 7);
    		}).valueAction_(0.2),
    		StaticText().string_('Mod'),
    	],
    ));
    
    filterCtrl = CompositeView(win, 300@200).background_(Color.rand);
    filterCtrl.layout_(GridLayout.columns([
    	MultiSliderView(w,Rect(0,0,300,200)).size_(16).isFilled_(true).elasticMode_(true).action_({
    		arg q;
    		q.value.collect({
    			arg v, index;
    			~filter.set("amp" ++ index, v.value);
    		})
    	}).valueAction_(16.collect({rrand(0.3, 0.7)})),
    	StaticText().string_('Spectral Filter'),
    ], [
    	Slider().action_({
    		arg v;
    		~filter.set(\rq, v.value.linlin(0, 1, 0.01, 0.5));
    	}).valueAction_(0.3),
    	StaticText().string_('Q'),
    ]));
    )
    Senast redigerat av sonicaddiction den 2024-02-09 klockan 22:55.

  7. #7
    oberdada
    oberdada är inte uppkopplad
    oberdadas avatar
    Veteran
    Ser intressant ut, men här var det ännu mer obekant syntax. Kanske skulle vara värt att kolla in en nybörjarintroduktion, om det finns någon du kan rekommendera.

  8. #8
    sonicaddiction
    sonicaddiction är inte uppkopplad
    sonicaddictions avatar
    Senior
    Jag kollade på den här. Han verkar köra SuperCollider-kurser regelbundet så det finns ett gäng olika terminer och versioner att följa om man vill. Jag tycker han är väldigt pedagogisk.
    https://youtube.com/playlist?list=PL...-FFyUFEP-KMFmy

  9. #9
    Steelberry
    Steelberry är inte uppkopplad
    Steelberrys avatar
    Veteran
    Eli Fieldsteel har även skrivit en bok om SuperCollider (som jag inte läst ännu)
    https://www.adlibris.com/se/bok/supe...-9780197617007 (finns i andra bokhandlar också)
    Senast redigerat av Steelberry den 2024-02-11 klockan 10:00.

Liknande ämnen

  1. [demo] FM: feedback, exponentiell, linjär ramp etc
    Av oberdada i forum Recensioner och demonstrationer
    Svar: 12
    Senaste inlägg: 2021-04-06, 13:49
  2. SuperCollider exempel
    Av jobromedia i forum Övrig mjukvara
    Svar: 6
    Senaste inlägg: 2014-07-22, 19:53
  3. Supercollider möter Twitter
    Av outshape i forum Övrig mjukvara
    Svar: 1
    Senaste inlägg: 2009-12-09, 14:42
  4. supercollider?
    Av qvick i forum Datorer & kringutrustning
    Svar: 6
    Senaste inlägg: 2002-10-31, 19:29

Behörigheter för att posta

  • Du får inte posta nya ämnen
  • Du får inte posta svar
  • Du får inte posta bifogade filer
  • Du får inte redigera dina inlägg
  •