JASS, Just Another Synth...Sort-of, codename: Gemini (UPDATED: esp with midi fixes)
JASS, Just Another Synth...Sort-of, codename: Gemini (UPDATED TO V-1.0.1)
jass-v1.0.1( esp with midi fixes).zip
1.0.1-CHANGES:
- Fixed issues with midi routing, re the mode selector (mentioned below)
- Upgraded the midi mode "fetch" abstraction to be less granular
- Fix (for midi) so changing cc["14","15","16"] to "rnd" outputs a random wave (It has always done this for non-midi.)
- Added a midi-mode-tester.pd (connect PD's midi out to PD's midi in to use it)
- Upgrade: cc-56 and cc-58 can now change pbend-cc and mod-cc in all modes
- Update: the (this) readme
INFO: Values setting to 0 on initial cc changes is (given midi) to be expected.
JASS is a clone-based, three wavetable, 16 voice polyphonic, Dual-channel synth.
With...
- 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~
Instructions
Requires: zexy
for-entire-state
- 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~
for-all-mod-types
- /wavetable
- 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
for-each-mod-type
- 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
midi-implementation
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 |
In closing
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.
Sincerely,
Scott
Why does Pd look so much worse on linux/windows than in macOS?
@oid:
all my wires come out as shown in the screen grab of my redraw of Ingox's patch, nice crisp single pixel lines.
and
I have not seen aliasing effects like that since the early 90s
We might be having a terminology problem here.
Graphics aliasing is: A line should ideally look like a diagonal, but instead it looks like stairsteps.
The "changing thickness" that you mentioned could be seen as one case of aliasing... but... your "nice crisp single pixel lines" are in fact aliased. You are seeing aliasing -- every day when you use Pd. (Edit: deleted a bit here, not helpful comment from me)
So, for fun:
(
u = UserView(nil, Rect(800, 200, 450, 300)).front;
u.background = Color.white;
u.drawFunc = { |view|
var drawPort = { |x, y|
3.do { |i|
Pen.moveTo(Point(x, y + i))
.lineTo(Point(x + 8, y + i))
};
Pen.stroke;
};
Pen
.color_(Color.black)
// integer pixels are "between" canvas pixels
// and subject to anti-aliasing
// by shifting the coordinates by a half pixel,
// lines are drawn exactly on display pixels
.translate(0.5, 0.5)
.moveTo(106@29)
.lineTo(130@29)
.lineTo(135@34)
.lineTo(135@49)
.lineTo(106@49)
.lineTo(106@29)
.stroke;
drawPort.(106, 29);
drawPort.(106, 47);
Pen.moveTo(117@142)
.lineTo(157@142)
.lineTo(157@162)
.lineTo(117@162)
.lineTo(117@142)
.stroke;
drawPort.(117, 142);
drawPort.(117, 160);
Pen.moveTo(109@49).lineTo(120@142).stroke;
};
u.refresh;
)
If you prefer the version on the left, that's fine. We can agree to disagree about the aesthetics. But I don't think there's any room to disagree with my assertion that the version on the left does not reflect the state-of-the-art in graphics rendering. It simply is out of date.
Would Pd benefit from a more modern graphical presentation? Yes. (Would it be a large investment of developer resources -- yeah, probably too large. So it won't happen. Doesn't mean that the current state of things is good exactly.)
@ddw_music @ingox what do you get if you run lsof -p $(pidof Xorg) | grep /dev/dri in a terminal?
I get nothing.
this is a driver issue or possibly your distro's TK
If it's a driver issue, that would be assuming that the processing chain goes something like "software requests a line to be drawn --> the request is passed along to the video driver --> video driver does (or doesn't do) anti-aliasing." I'm pretty sure that's not how it works -- especially considering that the above screenshot shows different rendering, but under the same video driver.
The distro's TK version:
$ tclsh
% info patchlevel
8.6.8
The absolute most recent seems to be 8.6.10. So I would doubt that there is a different Linux distribution where Tk's drawing is significantly improved.
So let's compare Tk's native drawing outside of Pd to Qt, borrowing a script from http://zetcode.com/gui/tcltktutorial/drawing/ :
That confirms one thing at least -- it's Tk's fault. The Tk one on the left is... like... it's 2020, why is a graphics toolkit drawing like this in 2020? Are they for real? (So, the Pd problem is that it's hitched itself to a badly out of date wagon. That might have been a good decision at the time, but Tk hasn't kept up with the modern world, and it's holding Pd back in that regard.)
hjh
help installing .51 on debian
Thanks in advance to anyone who can help with this! I need to install Pd .51 on a remote server via ssh (in order to do some testing with quacktrip, a patch Miller is developing based on jacktrip, for networked music performance). I have tried this:
apt install puredata-dev_0.51.0-1_all.deb
and get these errors:
E: Unable to locate package puredata-dev_0.51.0-1_all.deb
E: Couldn't find any package by glob 'puredata-dev_0.51.0-1_all.deb'
E: Couldn't find any package by regex 'puredata-dev_0.51.0-1_all.deb'
Here are the sources I have listed in /etc/apt/sources.list (the last one I added, the others were already there):
deb http://mirrors.linode.com/debian buster main
deb-src http://mirrors.linode.com/debian buster main
deb http://mirrors.linode.com/debian-security buster/updates main
deb-src http://mirrors.linode.com/debian-security buster/updates main
deb http://mirrors.linode.com/debian buster-updates main
deb-src http://mirrors.linode.com/debian buster-updates main
deb http://ftp.us.debian.org/debian bullseye main
Can anyone point me to the source I need to add or the .deb file that I should use? Many thanks,
Michael
WaveMaker - A module for making waves soundscapes.
WaveMaker - is a module for making waves soundscapes using different types of filtered noise. From ocean moving waves to dark raining waves.
-- CasimirWaveMaker-2 is the third version of WaveMaker --
https://forum.pdpatchrepo.info/topic/12796/casimirwavemaker-2-module-for-making-wave-soundscapes
-- CasimirWaveMaker is the second version of WaveMaker --
https://forum.pdpatchrepo.info/topic/12791/casimirwavemaker-sequel-module-for-wavemaker-improved-by-seven-of-nine
patch download :
WaveMaker.zip
WaveMaker - snapshot :
stack overflow by trying to send/receive variable in module
Hello,
I'm currently working on a metronome module since i want to make a collection of modules i can use in my patches,
I have almost the whole module complete, there is just this one bug i cant get around...
When i try to send a variable to the output bang in the module (just a simple bang to tell when the metronome clicks happen), my pd freezes and takes a while to show the bangs from the output, and it gives me a stack overflow loop in the terminal.
The r output and s output works, but when i try it with the variable i set in the red output bang in the module, it crashes my pd.
I was wondering if anybody could help me with this situation, since i want to try to get this thing working soon.
Cheers,
kasanovpd
Pitch Envelope Generator
Hi,
I'm new to the forum and decided to sign up to expand and help my journey in PD. I've managed to make some basic patches and I've been trying to replicate a eurorack drum module as a basic starting point with the hope of building more stuff so i can make some music and learn synthesis. The module in question is an Audio Damage Neuron, its a 2 OP FM module with a single cycle 909 waveform for the carrier and a sin osc as the modulator.
I've used these parameters for a simple oscillator in PD with a little success however I get terrible aliasing (i think thats what it is?).
I'm also trying to implement a pitch envelope and amp decay but I'm struggling, Ive created a simple Pitch Envelope from a drawn tabled array but i would like to mix/fade it in to my oscillator and include a decay amp slider as well. Ideally i would like to do away with the tabled array and have sliders for ADSR, but im struggling with this element
Could anyone help me out?
I've uploaded some files
A link to the module in action is here:
any tips would be a huge help
thanks in advance
Generative slashi bubu patch using Automatonism system
@toxonic I didn't create the modules myself. They come in a large library of modules. The system is not very bullet proof. But i have some plans to improved it (GUI and functionality) EX: the VCA module has just one channel ; it is quite easy to improve it by adding multiple channels, to have a multichannel VCA. The problem with the system is that if you make a real generative patch (you need a ton of modules). This can lead to resource draining. One quick solution is to put groups of modules inside subpatches (hard to control the parameters). But i agree with you about system functionality. Anyways thank you very much and i will look at your patch.
https://www.automatonism.com/
BlurPD - digital logic framework system for Pure Data [v3]
BlurPD is a framework system to extend Pure Data with the ability to make
digital logic circuits while taking advantage of the DSP capabilities of Pure Data. In order to design and simulate interesting circuits, ASIC chips, DSP processors or entire CPU's, all in Pure Data. It is made from jucy fundamental modules (Lego blocks) that when put together turn Pure Data into a madness of bits ...
Bug Fixes & Notes [v3]
Modules [v3]
- GATES : not,and,nand,or,nor,xor,xnor,cfg,icfg,dna,ro,and3,or3,nand3,nor3,xor3,xnor3
- PLEXERS : 2x1multiplexer,1x2demultiplexer,1x2decoder
- MATH : adder,subtractor,multiplier,divider,comparator,comparator2
- IC : bpd1g8n (integrated 8xNAND gates)
- TOOLS : redled,blueled,greenled,yellowled,magentaled,cyanled,sigv,pininv,gateanalyer
ledmatrix,controller,adipswitch,vled,hexdisplay,sigbridge,pinanalyzer - WIRING : pininput,pinoutput,pin0,pin1,dipswitch,idipswitch
- MODULES : the core library for BlurPD built-in modules
- ICMODULES : the core library for "IC" modules
- DSP : btom,sin~,pha~,ipha~,cos~
- DSPTOOLS : scope~
New Stuff [v3]
- Changes to the Help system. Better GUI and integration [v3]
patch download
BlurPDv3-[3-7-2020].zip
BlurPD archive (older versions)
BlurPDv2.9-[3-3-2020].zip
BlurPDv2.8-[3-3-2020].zip
BlurPDv2.7-[3-3-2020].zip
BlurPDv2.6-[3-1-2020].zip
BlurPDv2.5-[2-29-2020].zip
BlurPDv2.4-[2-27-2020].zip
BlurPDv2.3-[2-26-2020].zip
BlurPDv2.2-[2-25-2020].zip
Multibit modules for more complex circuits [v3]
4-bit Boran-Tsung function using a 4-bit ALU (arithmetic logic unit) circuit made with BlurPD [v3]
4-bit Xi'n function using a 4-bit ALU circuit made with BlurPD [v3]
Snapshot of the modules system and help system [v3]
Making generative sounds using new DSP modules [v2.9]
Polymorphic circuit [v2.7]
Application 1 of BlurPD system from [v2.3]
Application 2 of BlurPD system from [v2.3]
Hexadecimal display [v2.3]
The Ancients [v2.2]
Complex analysis using a DIP-switch analyzer [v2.1]
DIPSwitch from [v2.0]
Cannot get Pyata to work
This error statement TypeError: 'module' object is not callable is raised as you are being confused about the Class name and Module name. The problem is in the import line . You are importing a module, not a class. This happend because the module name and class name have the same name .
If you have a class "MyClass" in a file called "MyClass.py" , then you should import :
from MyClass import MyClass
In Python , a script is a module, whose name is determined by the filename . So when you start out your file MyClass.py with import MyClass you are creating a loop in the module structure.
In Python, everything (including functions, methods, modules, classes etc.) is an object , and methods are just attributes like every others. So,there's no separate namespaces for methods. So when you set an instance attribute, it shadows the class attribute by the same name. The obvious solution is to give attributes different names.
FM stacked modulators
@roman.galyaminskiy Hi, what you are doing in the patch is "true" frequency modulation, in that you are modulation the frequency of [osc~] objects. Generally the way to do it in software (and indeed how it's done in the DX7, volca etc) is called phase modulation, which is analogous to FM, where instead you modulate the readout phase of cosine oscillators. This approach also allows you to have an oscillator modulating itself (which you need for operator 6 in the algorithm you are trying to emulate), although that needs to happen on a sample-by-sample basis, and you need to use the block~ object inside a subpatch for that.
I fixed your patch to do phase modulation, and now has 6 operators (number 6 has feedback). It probably won't sound exactly like the volca because you are missing a number of features (envelopes, frequency offset, phase locking etc), but it should get you started with exploring FM in Pd, hope it helps.
fm_mod_stack_fix.pd
I attempted to recreate this sort of thing some time ago, with a flexible algorithm structure. It's pretty involved and not intuitive at all, but it's basically the same concept as the above patch. It's a CPU hog enough with only 3 operators, but it sounds pretty good to me.
https://forum.pdpatchrepo.info/topic/10745/3-op-fm-synth-with-mod-matrix