wavebypartial.pd: Waveshaping intermediate waves between the four basic waveshapes
So reading/selecting across are the partials for that waveshape, ex. sine's are all "0", etc.
The bangs just after the waveshape-name select all the partials for that waveshape, ex. clicking sine's bang makes the wavetable a sine curve.
The sliders have been included in case you want to manually shape the wave.
note: best to change to Log Level 1 (errors) as it does throw a lot of the pd-rounding messages.
I had been wondering about this for a while..."How do you get at the between-shapes?".
May it serve of some use to you.
p.s. really just killing time until I have to get back to my much more complicated current project.
gensyn~: generic, multi-modulator synthesizer abstraction
what makes this synthesizer abstraction different is:
In addition to the common access to adsr(filter and amp) and vcf~(cutoff and frequency)
It also includes
- 5 available modulation types for two wavetables
- additive and frequency, phase, pulse, and amplitude modulation
- 8 possible types for each wavetable
- sine, square, triangle, saw, random, duty, pink noise, noise
- the random is by a settable number of partials
- the duty is a square wave with settable dutycycle
- sine, square, triangle, saw, random, duty, pink noise, noise
- access to two unique parameters per modulation type
Note: The -help file has a substantial number of examples. Especially, interesting are those changing modulation type, wavetype, parameters (per mod), partials, and dutycycle on a per-voice basis by both formula and over time.
I hope you enjoy it, get some use out of it, or it just makes you smile or giggle.
p.s. no picture necessary. And personally, I find this Very funny. -Peace.
- 5 available modulation types for two wavetables
waves: sin, square, triangle, saw, random, duty-square, pink noise (a 128 partial random sinesum) and noise (a 2051 partial sinesum)
the outlet sets a list for the random and duty sinesums (for saving).
credit for the dutycycle funtion goes to: @seb-harmonik.ar
After trying a lot of different things (in order to get the output to load a [text]), I discovered if I slow down the output it works fine.
I hope this may help you, if you may ever need to do such a thing.
FAILS: ls -1 ~/pd-externals/tof/*
WORKS: find ~/pd-externals/tof -exec sleep 0.001 ; -print
Just something funny about this, since this really only applies to grandchildren....
I can't count how many times I have been at my parent's place over Christmas with my kids, my brother, and his, that I have heard my parents tell the children "Take a number!".
Grandchildren (by nature?) seem to lose their identity.
Two benefits, to designing this way, I thought of:
- when debugging, how significantly it would cut down the count when doing a Find for your abstractions
- when analyzing your code for precedence, the "reader"/student would no longer need to drill down to the individual level, but could stop at the parent.
Thanks for the pointers.
I am, however, way less excited about subpatches and way more about abstractions.
That they can be created by(symbol) creation arguments within the parent patch. That, I never knew.
So given, patchN.pd, bypass.pd, adsr.pd, and patchN-help.pd (or grandparent), and object [patchN bypass adsr] inside a -help, objects [bypass] and [adsr] may be generated by only adding the objects [$1] and [$2] inside patchN.pd.
Subpatches aside, that alone for me is a huge game-changer.
I can organize All my abstractions by name when I declare an object, ex. [patchN abs1 abs2 abs3] and then just write those abs as [$1] [$2] [$3].
Which greatly improves the transparency for anyone wanting to digest my code.
When they see my abstraction declaration, they will know right up front what abstractions I am going to use inside it.
Yes. My thinking was correct. But you said it much better:
Subpatches can take creation arguments as they "take the $1 from the main patch where your subpatch is located".
As to always able to learn...
One of my core beliefs is "No matter what field or great your expertise that is always more to be learned.".
Though I agree, while pd documentation is excellent in many ways, it also falls short in many others (ex. not writing the controls into the control properties, across the board).
I've been programming pd for over five years and never knew this was possible.
Mark it up as "There is always something new to learn".
- Subpatches CAN have creation arguments and it is the same one as its parent
- if the creation argument is a symbol and is the name of a .pd in the parent's folder, then that creation argument by itself IS that abstraction
- the symbol creation argument by itself will be represented with its gui
- creation arguments with relative paths ARE represented
The implication being...rather than throwing abstractions around in your patch (by name), just include them as creation arguments and use the creation argument instead of the abstraction name.
"Write once..." and less(!) right?
Peace through sharing,
p.s. I am 100% certain there are a lot of people who already knew this. Then, again,...
you never know when you're going to learn something.
JASS, Just Another Synth...Sort-of, codename: Gemini
JASS is a clone-based, three wavetable, 16 voice polyphonic, Dual-channel synth.
- The initial, two wavetables combined in 1 of 5 possible ways per channel and then adding those two channels. Example: additive+frequency modulation, phase+pulse-modulation, pulse-modulation+amplitude modulation, fm+fm, etc
- The third wavetable is a ring modulator, embedded inside each mod type
- 8 wave types, including a random with a settable number of partials and a square with a settable dutycycle
- A vcf~ filter embedded inside each modulation type
- The attack-decay-release, cutoff, and resonance ranges settable so they immediately and globally recalculate all relevant values
- Four parameters /mod type: p1,p2, cutoff, and resonance
- State-saving, at both the global level (wavetables, env, etc.), as well as, multiple "substates" of for-each-mod-type settings.
- Distortion, reverb
- Midiin, paying special attention to the use of 8-knob, usb, midi controllers (see below for details)
- zexy-limiters, for each channel, after the distortion, and just before dac~
- O: Open preset. "default.txt" is loaded by...default
- S: Save preset (all values incl. the multiple substates) (Note: I have Not included any presets, besides the default with 5 substates.)
- SA: Save as
- TEST: A sample player
- symbol: The filename of the currently loaded preset
- CL: Clear, sets all but a few values to 0
- U: Undo CL
- distortion,reverb,MASTER: operate on the total out, just before the limiter.
- MIDI (Each selection corresponds to a pgmin, 123,124,125,126,127, respectively, see below for more information)
- X: Default midi config, cc[1,7,8-64] available
- M: Modulators;cc[10-17] routed to ch1&ch2: p1,p2,cutoff,q controls
- E: Envelopes; cc[10-17] routed to filter- and amp-env controls
- R: Ranges; cc[10-17] routed to adr-min/max,cut-off min/max, resonance min/max, distortion, and reverb
- O: Other; cc[10-17] routed to rngmod controls, 3 wavetypes, and crossfade
- symbol: you may enter 8 cc#'s here to replace the default [10-17] from above to suit your midi-controller's knob configuration; these settings are saved to file upon entry
- vu: for total out to dac~
- graph: of the chosen wavetype
- part: partials, # of partials to use for the "rn" wavetype; the resulting, random sinesum is saved with the preset
- duty: dutycycle for the "du" wavetype
- type: sin | square | triangle | saw | random | duty | pink (pink-noise: a random sinesum with 128 partials, it is not saved with the preset) | noise (a random sinesum with 2051 partials, also not saved)
- filter-env: (self-explanatory)
- amp-env: (self-explanatory)
- rngmod: self-explanatory, except "sign" is to the modulated signal just before going into the vcf~
- adr-range: min,max[0-10000]; changing these values immediately recalculates all values for the filter- and amp-env's scaled to the new range
- R: randomizes all for-all-mod-types values, but excludes wavetype "noise"; rem: you must S or SA the preset to save the results
- U: Undoes R
- mod-type-1: (In all cases, wavetable1 is the carrier and wavetable2 is the modulator); additive | frequency | phase | pulse | amplitude modulation
- mod-type-2: Same as above; mod-type-2 May be the same type as mod-type-1
- crossfade: Between ch1 and ch2
- detune: Applied to the midi pitch going into ch2
- for-each-clone-type controls:
- p1,p2: (self-explanatory)
- cutoff, resonance: (self-explanatory)
- navigation: Cycles through the saved substates of for-each-mod-type settings (note: they are lines on the end of a [text])
- CP: Copy the current settings, ie. add a line to the end of the [text] identical to the current substate
- -: Delete the current substate
- R: Randomize all (but only a few) substate settings
- U: Undo R
- cut-rng: min,max[0-20000] As adr-range above, this immediately recalculates all cutoff values
- res-rng: min,max[0-100], same as previously but for q
- pbend: cc,rng: the pitchwheel may be assigned to a control by setting this to a value >7 (see midi table below for possibilities); rng is in midi pitches (+/- the value you enter)
- mod-cc: the mod-wheel may be assigned to a control [7..64] by setting this value
name --- Description sysex not supported pgmin 123,124,125,126,127; They set midi mode notein 0-127 bendin pbend-cc=7>pitchbend; otherwise to the cc# from below touch not supported polytouch not supported
cc - basic (for all midi-configs)
# name --- desciption 1 mod-wheel (assignable) 7 volume Master
cc - "X" mode/pgmin=123
cc --- parameter 8 wavetype1 9 partials 1 10 duty 1 11 wavetype2 12 partials 2 13 duty 2 14 wavetype3 15 partials 3 16 duty 3 17 filter-att 18 filter-dec 19 filter-sus 20 filter-rel 21 amp-att 22 amp-dec 23 amp-sus 24 amp-rel 25 rngmod-freq 26 rngmod-sig 27 rngmod-filt 28 rngmod-amp 29 distortion 30 reverb 31 master 32 mod-type 1 33 mod-type 2 34 crossfade 35 detune 36 p1-1 37 p2-1 38 cutoff-1 39 q-1 40 p1-2 41 p2-2 42 cutoff-2 43 q-2 44 p1-3 45 p2-3 46 cutoff-3 47 q-3 48 p1-4 49 p2-4 50 cutoff-4 51 q-4 52 p1-5 53 p2-5 54 cutoff-5 55 q-5 56 pbend-cc 57 pbend-rng 58 mod-cc 59 adr-rng-min 60 adr-rng-max 61 cut-rng-min 62 cut-rng-max 63 res-rng-min 64 res-rng-max
cc - Modes M, E, R, O
Jass is designed so that single knobs may be used for multiple purposes without reentering the previous value when you turn the knob, esp. as it pertains to, 8-knob controllers.
Thus, for instance, when in Mode M(pgm=124) your cc send the signals as listed below. When you switch modes, that knob will then change the values for That mode.
In order to do this, you must turn the knob until it hits the previously stored value for that mode-knob.
After hitting that previous value, it will begin to change the current value.
cc - Modes M, E, R, O assignments
Where [10..17] may be the midi cc #'s you enter in the MIDI symbol field (as mentioned above) aligned to your particular midi controller.
cc# --- M/pgm=124 --- E/pgm=125 --- R/pgm=126 --- O/pgm=127 10 ch1:p1 filter-env:att adr-rng-min rngmod:freq 11 ch1:p2 filter-env:dec adr-rng-max rngmod:sig 12 ch1:cutoff filter-env:sus cut-rng-min rngmod:filter 13 ch1:q filter-env:re cut-rng-max rngmod:amp 14 ch2:p1 amp-env:att res-rng-min wavetype1 15 ch2:p2 amp-env:dec res-rng-max wavetype2 16 ch2:cutoff amp-env:sus distortion wavetype3 17 ch2:q amp-env:rel reverb crossfade
If you have anywhere close to as much fun (using, experimenting with, trying out, etc.) this patch, as I had making it, I will consider it a success.
For while an arduous learning curve (the first synth I ever built), it has been an Enormous pleasure to listen to as I worked on it. Getting better and better sounding at each pass.
Rather, than say to much, I will say this:
Enjoy. May it bring a smile to your face.
Peace through love of creating and sharing.