DrJustice contributions


#1

Forum profile : @DrJustice
Contributor prefix: drj

objects
drj/audio/out_stero_vol - output with volume control and 12dB gain
drj/audio/deglitcher - audio deglitcher
drj/audio/deglitcher - audio deglitcher with buiult in volume control
drj/audio/stereo_vol - stereo volume control with external volume input
drj/audio/stereo_vol - stereo volume control with volume knob
drj/osc/dual_sine.axo - dual phase sine oscillator, 0 and 90 degrees
drj/osc/quad_sine.axo - quad sine oscillator 0, 90, 180 and 270 degrees
drj/osc/phasor_pm_pr_b - bipolar phasor with phase modulation and phase reset
drj/osc/phasor_pm_pr_p - unipolar phasor with phase modulation and phase reset
drj/osc/phasor_pm_s_b - bipolar phasor with phase modulation and sync
drj/osc/phasor_pm_s_p - unipolar phasor with phase modulation and sync
drj/osc/sine_pm_pr_b - bipolar sine osc with phase modulation and phase reset
drj/osc/sine_pm_pr_p - unipolar sine osc with phase modulation and phase reset
drj/osc/sine_pm_s_b - bipolar sine osc with phase modulation and sync
drj/osc/sine_pm_s_p - unipolar sine osc with phase modulation and sync
drj/lfo/lfo_pwm_b - bipolar pwm lfo
drj/lfo/lfo_pwm_u - unipolar pwm lfo
drj/lfo/sin_ph_b - bipolar sine lfo with phase control
drj/lfo/sin_ph_p - unipolar sine lfo with phase control
drj/lfo/sin_2_b - dual bipolar sine lfo, 0 and 90 degrees
drj/lfo/sin_2_p - dual unipolar sine lfo, 0 and 90 degrees
drj/lfo/sin_4_b - quad bipolar sine lfo, 0 and 90 degrees
drj/lfo/sin_4_p - quad unipolar sine lfo, 0, 90 , 180 and 270 degrees
drj/lfo/tri_b - bipolar triangle lfo
drj/lfo/tri_p - unipolar triangle lfo
drj/lfo/tri_2_b - dual bipolar triangle lfo, 0 and 90 degrees
drj/lfo/tri_2_p - dual unipolar triangle lfo, 0 and 90 degrees
drj/lfo/tri_4_b - quad bipolar triangle lfo, 0 and 90 degrees
drj/lfo/tri_4_p - quad unipolar triangle lfo, 0, 90 , 180 and 270 degrees
drj/lfo/sin_2_b - dual bipolar sine lfo, 0 and 120 degrees
drj/lfo/sin_2_p - dual unipolar sine lfo, 0 and 120 degrees
drj/lfo/sin_3_b - triple bipolar sine lfo, 0, 120 and 240 degrees
drj/lfo/sin_3_p - triple unipolar sine lfo, 0, 120 and 240 degrees
drj/lfo/tri_2_b - dual bipolar triangle lfo, 0 and 120 degrees
drj/lfo/tri_2_p - dual unipolar triangle lfo, 0 and 120 degrees
drj/lfo/tri_3_b - triple bipolar triangle lfo, 0, 120 and 240 degrees
drj/lfo/tri_3_p - triple unipolar triangle lfo, 0, 120 and 240 degrees
drj/lfo/saw_up_b - bipolar rising sawtooth lfo
drj/lfo/saw_up_p - unipolar rising sawtooth lfo
drj/lfo/saw_dn_b - bipolar falling sawtooth lfo
drj/lfo/saw_dn_p - unipolar falling sawtooth lfo
drj/lfo/lfo_sync - multi waveform LFO with midi/clock sync
drj/lfo/multi_wave_sync - selectable waveform, uni/bi -polar, syncable
drj/lfo/multi_wave - selectable waveform, uni/bi -polar
drj/lfo/multi_wave - selectable waveform, uni/bi -polar, modulation
drj/lfo/dual_multi_wave - selectable waveform, uni/bi -polar, quadrature
drj/lfo/dual_multi_wave - selectable waveform, uni/bi -polar, quadrature, modulation
drj/ctrl/dial_pitch - dial with pitch mapped output
drj/ctrl/fadein_xor - fade/difference control
drj/ctrl/fadeout_xor - fade/difference control
drj/delay/read_sync - delay reader with sync and modulation
drj/delay/read_interp_sync - interpolated delay reader with midi/clock sync and modulation
drj/delay/read32_sync - delay reader with sync and modulation, 32 bit
drj/delay/read32_interp_sync - interpolated delay reader with midi/clock sync and modulation, 32 bit
drj/math/> const i - compare to constant integer
drj/math/< const i
drj/math/== const i
drj/math/!= const i
drj/math/glide_fast - a faster glide module
drj/math/keyscaler - keyboard breakpoint sand scale
drj/math/offset_scale_1 - out = offset + (in * scale)
drj/math/offset_scale_2 - out = offset + (in * scale), s-rate
drj/math/mov_avg - moving average, k-rate fractional and integer, and s-rate fractional
drj/math/mov_avg_clk - moving average with clocking, k-rate fractional and integer
drj/midi/clock_rx - MIDI clock and tranport control receiver
drj/midi/clock_tx - MIDI clock and tranport control transmitter
drj/midi/note_tx - note transmitter with live channel control
drj/midi/nrpn_rx_multi - multi output NRPN receiver
drj/midi/nrpn_rx_multi2 - multi parameter, multi output NRPN receiver
drj/midi/nrpn_rx_f - fractional output NRPN receiver
drj/midi/nrpn_rx_i - integer output NRPN receiver
drj/patch/preset_manager.axo - manager for loading and saving presets
drj/seq/clk_div - clock divider
drj/seq/clk_mul - clock multiplier
drj/seq/seq_clk - step sequencer clock controller
drj/seq/seq_clk_sync - step sequencer clock controller with midi/clock sync
drj/seq/pattern_selector - 4 way syncable step sequencer pattern selector
drj/seq/stepseq_4_b - bipolar value * 4 selector
drj/seq/stepseq_4_u - bipolar value * 4 selector
drj/seq/stepseq_4_pitch - bipolar value * 4 selector
drj/seq/stepseq_4_switch - switch * 4 selector
drj/seq/stepseq_8_b
drj/seq/stepseq_8_u
drj/seq/stepseq_8_pitch
drj/seq/stepseq_8_switch
drj/seq/stepseq_16_b
drj/seq/stepseq_16_u
drj/seq/stepseq_16_pitch
drj/seq/stepseq_16_switch
drj/seq/tap_tempo - tap tempo clock generator
drj/switch/ser_par_1 - mono serial/parallel switch
drj/switch/ser_par_2 - stereo serial/parallel switch
drj/switch/ser_swap_1 - mono serial order swapping switch
drj/switch/ser_swap_2 - stereo serial order swapping switch
drj/switch/par_swap_1 - mono parallel output swapping switch
drj/switch/par_swap_2 - stereo parallel output swapping switch
drj/switch/fm4op_alg - router for 4 operator FM synthesis, ala TX81Z
drj/fx/chorus - multi voice chorus, 3 variants
drj/fx/phaser_32_mod - phaser with built in controls and modulation
drj/fx/phaser_32 - phaser with external controls and modulation
drj/file_file_size - outputs the number of 16 bit samples in a named file

patches
drj/delay/delay_st_pp.axs - stereo/ping-pong delay
drj/delay/delay_st_pp_mod.axs - stereo/ping-pong modulation delay
drj/delay/delay_st_pp_sync.axs - stereo/ping-pong midi/clock syncable delay
drj/delay/delay_st_pp_mod_sync.axs - stereo/ping-pong midi/clock syncable modulation delay
drj/fx/stereo_chorus.axs - stereo chorus subpatch
drj/fx/stereo_phaser.axs - stereo phaser subpatch

firmware
none yet


Cpwitz Contributions
#2

drj/osc/dual_sine.axo

drj/osc/quad_sine.axo

status

Ready to use

description

dual_sine is a dual sine oscillator with outputs at 0 and 90 degrees.
quad_sine is a quadrature sine oscillator with outputs at 0, 90, 180 and 270 degrees.


#3

A family of LFOs

drj/lfo/sin_ph_b - bipolar sine lfo with phase control
drj/lfo/sin_ph_p - unipolar sine lfo with phase control
drj/lfo/sin_2_b - bipolar dual sine lfo, 0 and 90 degrees
drj/lfo/sin_2_p - unipolar dual sine lfo, 0 and 90 degrees
drj/lfo/sin_4_b - bipolar quadrature sine lfo, 0 and 90 degrees
drj/lfo/sin_4_p - unipolar quadrature sine lfo, 0, 90 , 180 and 270 degrees
drj/lfo/tri_b - bipolar triangle lfo
drj/lfo/tri_p - unipolar triangle lfo
drj/lfo/tri_2_b - bipolar dual triangle lfo, 0 and 90 degrees
drj/lfo/tri_2_p - unipolar dual triangle lfo, 0 and 90 degrees
drj/lfo/tri_4_b - bipolar quadrature triangle lfo, 0 and 90 degrees
drj/lfo/tri_4_p - unipolar quadrature triangle lfo, 0, 90 , 180 and 270 degrees
drj/lfo/saw_up_b - bipolar rising sawtooth lfo
drj/lfo/saw_up_p - unipolar rising sawtooth lfo
drj/lfo/saw_dn_b - bipolar falling sawtooth lfo
drj/lfo/saw_dn_p - unipolar falling sawtooth lfo

status

Ready to use

description

This is a family of bipolar and unipolar LFOs with one two or four outputs at successively delayed phases. All of them have pitch and phase reset inputs, and the single sine lfos also have phase inputs.


#4

drj/patch/preset_manager.axo

status

In development, subject to changes based on feedback.

description

The preset manager saves and loads all parameters in the patch level it appears in, using the SD card for storage. This should not be confused with the built in presets system. Each sub patch may need their own preset manager to handle its parameters, in the case of hierarchical patches and depending on what you want saved. (A global load/save mode may be added later)

Note that if modules in a patch, or any of its sub patches are added, removed or changed, then the presets will no longer load correctly for the changed (sub)patches. Also be aware that on saving, you will get a glitch in the audio as the SD write blocks for a moment.

There are 4 ways to load and save presets:
1 - Using MIDI by sending standard program change messages.
2 - Using MIDI by sending designated CCs set the preset number and trigger load and save operations.
3 - Using the preset number spinbox, load and save buttons on the module for managing presets from patch windows.
4 - Using the preset, load and save inputs to set the preset number and trigger load and save operations.

The pgmchange menu enables or disables MIDI program changes.

The channel spinbox sets the MIDI channel that will be used for MIDI control.

The presetcc, loadcc and savecc spinboxes selects the MIDI CC numbers used for controlling the preset manager. The preset number to load or save is set with presetcc, the load action is triggered by loadcc and the save action is triggered by savecc. Set the CC numbers to -1 to disable their corresponding functions.

The autoload spinbox selects a preset number which will be loaded automatically when the patch starts. Set autoload to -1 for no preset to be loaded.

The preset spinbox, load and save buttons control the load and save operations directly from a patch window.

The preset output and the save and load pulse outputs can be used to chain save/load actions to sub patches by connecting to the corresponding inputs of other preset managers. If managing presets by MIDI only, the preset managers (in the various sub patches) that listens to MIDI does not need to be chained together. When a preset manager gets a change message via MIDI, it will not send save/load pulses to avoid multiple load/save triggers.

The filenames are constructed of a prefix, taken form the prefix string input, a three digit zero padded preset number and a file extension. The preset files are saved in the SD card directory of the current patch. So a preset filename looks like e.g.:
0:/my_patch/foo001.pst

This means there are 1000 preset slots, although only the first 128 can be accessed via MID (for now).

If a patch has multiple preset managers throughout its sub patches, each preset manager needs a unique string for the prefix. This allows each sub patch to save its parameters to separate files that can be reloaded later by the same sub patch in a different context. As an example, saving preset number 123 for "my_patch", containing two preset managers with the prefixes "syn" and "echo", results in the following files being created:
0:/my_patch/syn123.pst
0:/my_patch/echo123.pst

The file format is an array of 32 bit words, with a two word header:
word 0 => "PRS1", file type identifier string
word 1 => number of parameters
word 2 => first parameter value
..
word N => last parameter value


Newbie Questions about Patch Loading, Preset saving, Polyphony, Midi Channels of standalone patches
Rotary Switch for selecting programs
#5

Really awesome :smile: There have been a lot of talk about how to do this. Cant wait to try it out :wink:


#6

It's not perfect I'm, afraid, but it's a start. I really want to add a mode where one preset manager can save and load the parameters for all sub patches. The current per sub patch way would still be useful as you can selectively save and load presets for the various sub patches. E.g. in a performance oriented patch, you could load different synth sub patch presets and fx sub patch presets at will, using MIDI or some dials and buttons in the top level patch window, while leaving other sub patches untouched.


#7

Couldn't you just connect a ctrl/i to the preset objects in all of the subpatches to change presets on all of them simultaniously?

Anyway, in my case, I mostly use presets on the top level patch. So I think this could be very helpful :smile:

BTW, Is the preset object DSP hungry?

But yeah, I see it has got many usecases :smile:


#8

Yes, you could just use route some dials and buttons to the control inputs of the preset managers throughout the sub patches. That's how I plan to use it. It's also a possibility to use it just on the top level, and then use "parameter on parent" to expose the controls you want saved and loaded in the top level patch.

It uses almost no DSP power (less than 0.1%) as it just sits idle and waits for triggers. The load spikes on the load and save operations tough, but I don't find that a problem - small price to pay for having preset management...

Below is an example of use. The patch and sub patch, preset_manager_demo.axp and preset_manager_demo.axs, can be found in C:\Users< username >\Documents\axoloti\axoloti-contrib\patches\drj\demo. Note that connecting a button to the save trigger input of a preset manager on the same patch level is not a good idea in real life since its pressed state will be saved if you press the button...


#9

How to set that up on top level If the object itself is included in the saved state?

Thanks again, and awesome work :smile:


#10

The preset manager does indeed save its own parameters (it just has three parameters: preset, load and save buttons - the other ones are attributes and are only saved with the patch). This is not a problem though, the built in load and save buttons are negative edge triggered (action happens when you release them) to avoid any undue effects of that. At one point I had the module skip the saving of its own parameters, but for several reasons it was better to go for action-on-release buttons on the module and let things work 'naturally'.

The only no-go is to connect a button to the save trigger input on a preset manager on the same patch level (the buttons pressed state would be saved) - but that's not necessary since the module has load and save buttons built in. Oh, and you don't want to create a loop with the load/save trigger chain :grin:


#11

Thank you so much for the preset manager !


#12

Works pretty well on its own.

:+1:

Also I noticed like you said that you cannot connect a button to the save input.... you cant connect a ctrl/i to the preset inlet, cause the ctrl/i is saved with the presets. Like this:

But still really cool :smile: Thanks :wink:


#13

The preset manager has been updated. This new version have two new features:

1 - Saves parameters as name/value pairs [1], and so it should not be dependent on the order/placement of objects in the patch.

2 - Introduces a new attribute called "savemode". The "Global" mode allows a single preset manager to save all parameters in the patch, including all sub patches. The "SubPatch" mode works like the previous version, except for point 1 above.

Edit: I just added a third save mode "SubPatchV1", which is the exact same functionality as the first version of preset manager. While I'm keen on the added integrity name binding gives, missing the integer spinbox parameter (and possibly others) is not so cool, and I'll leave this option in until full integrity can be ensured for the other modes.

There is currently a drawback to implementing point 1: some parameters aren't currently being registered by the patches (in xpatch.cpp), and they will not be saved. When this issue/bug in the Axoloti base software is fixed, all parameters will be saved as expected. Currently I have identified the integer spinbox (ParameterInt32Box) as not being registered, but there could be others. If you test this object, please watch the Axoloti console and see if it reports any skipped/missing parameters on save/load in SubPatch mode (in Global mode this can't be easily detected unfortunately) - if you spot any other non-registered parameters, recognized by not being updated on a load, please report here.

Apart from the missing parameter type(s?), it now works better, since data integrity is helped by storing the parameter names. There is one problem with that though: in Global mode, two equally named parameters in different sub patches will create confusion. This can only be fixed if the patches store a list of sub patches (in xpatch.cpp, I'm discussing this elsewhere with tb, and I'm hoping this can be included in the next Axoloti version).

Given a fix for the non-registered parameters and a sub patch list, this module will perform complete preset management, like we're used to from most synthesizers.

The file format version has been bumped from 1 to 2. If you have saved data with the previous version, it should still be loaded back, but that support will be removed with the next update.

[1] In the files, only a hash of the name is actually saved.


Preset Manager with axocontrol
Suggestion for more "easy assignable" presets
Large set of constants, most economical way to store/recall?
#14

A family of audio routing switches

drj/switch/ser_par_1 - mono serial/parallel switch
drj/switch/ser_par_2 - stereo serial/parallel switch
drj/switch/ser_swap_1 - mono serial order swapping switch
drj/switch/ser_swap_2 - stereo serial order swapping switch
drj/switch/par_swap_1 - mono parallel output swapping switch
drj/switch/par_swap_2 - stereo parallel output swapping switch
drj/switch/fm4op_alg - router for 4 operator FM synthesis, ala TX81Z

status

Ready to use

description

These switches were made to cover for switchable FX routing in my patches, but they can of course be used for anything requiring the provided switching functionality.

The fm4op_alg object is for building 4 operator FM synthesis patches ala TX81Z. It has the 8 algorithms that the TX81Z has, with the difference that all leaf operators have a feedback loop available, not only operator 4 as in the TX case. If you do not want feedback, just turn down the modulation index for the operators in question (that would be part of the operators you supply).


#15

Hi DrJustice,
Not sure if you take requests :wink: , but is there any chance of a triangular and sine LFOs with 120 degree phase outputs? those would be useful to create Solina-like "triple-chorus" effects. Thanks!


#16

Hey DrJustice , did you remove the preset manager from git ?


#17

^ The preset manager is back.

I don't know why it was gone (but it's a good thing: I want some other objects to be gone, or rather moved to different folders - must talk to Johannes/tb about this).


#18

More members in the family of LFOs

drj/lfo/sin_2_b - dual bipolar sine lfo, 0 and 120 degrees
drj/lfo/sin_2_p - dual unipolar sine lfo, 0 and 120 degrees
drj/lfo/sin_3_b - triple bipolar sine lfo, 0, 120 and 240 degrees
drj/lfo/sin_3_p - triple unipolar sine lfo, 0, 120 and 240 degrees
drj/lfo/tri_2_b - dual bipolar triangle lfo, 0 and 120 degrees
drj/lfo/tri_2_p - dual unipolar triangle lfo, 0 and 120 degrees
drj/lfo/tri_3_b - triple bipolar triangle lfo, 0, 120 and 240 degrees
drj/lfo/tri_3_p - triple unipolar triangle lfo, 0, 120 and 240 degrees

status

Ready to use

description

This is an extension to the family of bipolar and unipolar LFOs, this time with two and three outputs at successively delayed phases, 0, 120 and 240 degrees. All of them have pitch and phase reset inputs.


#19

you removed it, in this commit... perhaps an accident?

the only disadvantage with removing, rather than moving it you can loose the commit/change history.
so if you need things moved, you can do this directly with git tools, or PM me if you need a hand.

(perhaps worth pointing out to others... if you accidentally delete something we get it back, such is the wonders of version control... nothing is lost :smile: )


#20

Ahhh... yes, I should've checked the git history. I did the move from here - seems fine in the repository.