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.
@whale-av Thank you, for letting me know. I appreciate it.
Updated it a bit below and will have to look up "magic glass", not familiar with it.
This mini versions has;
a smaller name so easier to write in: mvu;
numbers [0..10,+] indicating level(:+ for over rms=1) and;
is much smaller (25x25 px but still colorized), so looks more like an actual pointer.
I was very curious if this could be done. And honestly, believe colorized connectors (showing env~) should be a feature, and, if not that then, a plugin cursor that lights up according to env, or possibly even value. (But, alas, alack, making plugins is not (yet) in my mission statement).
So, for now, this points in that direction.
Enjoy. May it serve you well.
Peace through Pure Data.
A movable, autoconnnecting vu meter;
esp. for debugging code;
requires: iemguts, cyclone, that dsp be on, and that the [namecanvas watchmvu] object be added to the patch that you want to investigate.;
Once setup and the abs is added, switch to Edit Mode, and left click and drag the vu meter over any audio objects and let it rest over the top-left-most corner of the object..;
The meter will autoconnect to that object's first outlet~. If you move it away (>25px) it will disconnect.;
I.e. allowing you to track and investigate the audio flow~ within your patch.
How to connect multiple outlets to multiple inlets, etc.
(I saw someone do this on a video so looked it up.
The info was originally posted on the newsgroup at:
[link Intelligent Patching](link https://lists.puredata.info/pipermail/pd-list/2018-06/122789.html) by IOhannes m zmoelnig .)
These do work. Just sort of tricky to get the steps right.
new connection features:
select any two objects, and press <Ctrl>+<k> (or <Cmd>+<k> if you insist), to connect them (trivially, so just the first inlet)
to connect a (signal) outlet to multiple arbitrary inlets, you can now press <Shift> while hovering the yet-unconnected cord over an inlet
to add more connections between two already connected object, select the connection and pressl <Ctrl>+<d> to extend the connections to the right ("duplicate")
to fully connect two objects, select both objects before connecting them.
to connect multiple objects to a single inlet, select all the source objects (but not the sink object) before connecting them.
(the other way round works as well, but will give you fan-outs!!!)
to connect multiple objects to a multi-inlet object, select all the source objects and the sink object before connecting the leftmost source to the leftmost inlet.
to connect a multi-outlet object to multiple objects, select all the source object and all the sink objects before connecting the leftmost outlet to the leftmost sink.
May the info/techniques help to expedite yr work flow.
Peace through sharing.
abs-fetch-slider: using a value (slider) multiple ways based on creation argument
reuse a value by only changing the value;
once the value matches the previously set value;
for that index/creation argumet.;
Getting a (hardware) knob to serve multiple functions;
by only having it change its value once the previous value for that index is hit.;
(See the help file for details, using two ctlin to set multiple values)
I have found it very frustrating that when using hardware you can't use one knob for multiple purposes because the knob is literally always in the last state you left it.;
one creation argument: the identifying index;
two inlets: left: the incoming value and right the index;
one outlet the value for that index
When you change the index, just change the knob until the audio, image, value, etc., i.e. result starts changing.
It will ONLY change once the previously set value for that index is hit..
So it "saves state".