JT contributions


#1

Some new objects in test:

Filters:

  • jt/filter/vcf4pole based on Miller Puckette's Runge-Kutta implementation
  • jt/filter/vcf4pole2x has a wider cutoff frequency range, but is more expensive
  • jt/filter/iqsplit 90 degree phase splitter for I/Q processing

Granular:

  • jt/granular/graindelay
  • jt/granular/graintable
  • jt/granular/grainverb
    Configureable granular delay, table readout and reverb, using non-transposed grains.

Distortion:

  • jt/dist/class a - Ok, most overdrive emulation will claim some sort of tube warmth or refer to rare vintage equipment. This one simply emulates some properties of a "class A" amplifier stage. Class A refers to a circuit topology, not to something expensive. The algorithm was inspired by the Regenerative frequency divider. While it is not a regenerative divider, it uses a very similar topology, which allows to reduce aliasing. Be careful with the drive knob, near the end of its range, it sounds like an amplifier that is just about to fall apart.

fx:

  • jt/fx/bode: bode frequency shifters (or Single Side Band "SSB" modulators) based on the iqsplit filter
  • jt/fx/chorus bode : bode shifting chorus effect.

patches

  • jt/led_string_ws2811 : driving a string of "intelligent" WS2811/WS2812 RGB LED strips/ropes, for cheap lightshows!

In development

  • patches/jt/devel/divider_organ.axp - Frequency divider organs are organs that contain 12 top octave oscillators, each of those goes into a cascade of frequency dividers to produce all chromatic frequencies. The Vox Continental is one example. While frequency division is not easy or cheap if it needs to be alias-free, the "octave division" idea allows to save a lot of computations compared to an explicit chromatic oscillator bank. This one generates (nearly alias-free) square waves, with an optional low-pass filter on each. "Drawbars" allow to tune the harmonic content further. Polyphony is unlimited!
    There is a fundamental difference with the square waves of a normal octave divider though, normally all square waves are aligned, but here it is the opposite, the edges never line up across all octaves.
    This one needs further development, sustain pedal is broken, attack/release envelope, perhaps replace the upper octave oscillators with sine waves, non-linear drawbar behavior...

Comments invited!


Cpwitz Contributions
#2

YES! Cant wait to test it:)


#3

The distortion class a sounds awesome! When will we get to play with it?

Edit: I just found it after the sync. Wonderful, smooth amp...

How do you make it without noise? Is there a built in gate?


#4

I second that! It sounds really good! Beefs up oscillators in a very good way when turned to 12 o clock!


#5

This is how "dist/class a" works (involves math...):

For constant values, its transfer curve approximates
y=x/(1+d*x)
where d is the drive level, like a waveshaper
but only iterative, without its filters it does
y(t) = x(t) + d*y(t-1)
generating from an input step signal:
x(t<0)=0
x(t>=0)=c

the following output step response:
y(0) = c
y(1) = c + d*c^2
y(2) = c + d*c^2 + d^2*c^3
y(3) = c + d*c^2 + d^2*c^3 + d^3*c^4

this converges to the MacLaurin series expansion of c/(1+d*c)
This reduces aliasing significantly compared to per-sample waveshaping with 1/(1+d*c), still an additional 2-point averaging filter is inserted after the input and in the feedback path to reduce aliasing further.

There is no noise gate involved.


#6

added:
jt/filter/iqsplit
jt/fx/bode
jt/fx/chorus bode

Descriptions are in the top post.


#7

Patches "jt/fx/bode" and "jt/fxchorus bode" refers to "jt/filters/iqsplitf" instead of "jt/filter/iqsplit", no ?


#8

You're right. It is fixed now.


#9

You missed one: the help file (iqsplit.axh) also still refers to the missing iqsplitf object.


#10

Thanks, fixed that one too.


#11

Added granular128.axp, description in top post :slight_smile:


#12

Not sure if your Distortion object will be based around distortion style effects or not, but I do know when guitarists are sourcing custom made distortion effects, the variety of clipping diodes and possible placement of only 2 - one in each direction, or 3 - two in one direction and one in the other, or 4 - two in each direction, can give quite a large choice as factors to help generate ones unique personal effect. And very useful from the boost effect, to the overdrive, then onto distortion.

Is this something that can be simulated within the math ?

I have been trying to copy the sound of all these three (boost, overdrive, distortion) in fact it is fundamental if I want to use the Axo with my music. I have in pedal varieties covering these 3 effects, as a novice not quite sure how to get to the target, but I expect the more options available, the more variety in the effect can be achieved.


#13

Just saw the link/audio object. Looks like a really great Idea. How should I link two boards in order to try it?


#14

The granular object sounds awesome, will it be expanded (maybe with options for grain size, number, panning, pitch) or is it just sold as is and open to exploitation?

In this last case i'd suggest to write some commentary in the code, which now looks really hardcore for basic users (mainly because of the pointers and STM functions)


#15

I posted a breakdown of fuzz/overdrive/distortion modelling here

Proof-of-concept firmware is developed and made public in the "spilink" branch on github, but I haven't written a setup guide, and the firmware is also missing diagnostic reporting that 'd help setting it up. Currently having trouble to allocate time to finish this effort. Stay tuned...

haha "sold" :slight_smile:
It's a working draft, that's why it is listed as under development, and is a patch containing an embedded object rather than a library object. Configurable grain size and number are certainly missing. The code currently exploits dependencies between grain size, number and audio buffer size to maximize performance:
At 128 grains of 2048 samples, and all grain phases distributed evenly, exactly one single grain needs a new random position per audio buffer. But in a similar fashion, a grain duration of 1024, 4096 or 8192 samples can be done, with respectively 2 position updates per buffer, one position update per two buffers, or one position update per four buffers.
Variable pitch is not implemented, and 'd increase the dsp load significantly. The left and right outputs each contain 64 hard-panned grains, adding random panning 'd increase the dsp load too.

In the big picture, I got a bit fascinated by tonewheel/drawbar approaches: rather than doing voice allocation, just running a full set of oscillators. Cross-breeding tonewheels with granular would require a massive amount of grains, when limiting to 64 tonewheels and two grains per tonewheel this requires... 128 simultaneous grains. This proofs this is possible with room to spare to increase to 80 or 96 tonewheels... The ability to access a grain table of 8MB means, this table could be split into 64 segments, each containing source material for every semitone. That's 1.333 seconds per semitone. Or the table could contain a single glissando of 64 semitones in 83.3 seconds, avoiding the need for pitching grains. Even with only two grains per tonewheel, a single key can mix tonewheels with the drawbars, I think the result could be rich and expressive, and totally alias-free.
The overlapping grain offsets could also be synchronized to pitch rather than random offsets.
Or perhaps skipping the tonewheel idea, a polyphonic synth could be made that uses 32 grains per voice (from a table containing segments for every semitone), so 4 voices can be played, and reducing the number of grains per voice progressively when more than 4 keys are playing...


#16

I'm going to sound unkind here, but I have to say, a tonewheel organ sounds about the least sonically interesting use for a hardcore grain-playback engine.

I can see with more controls (like those suggested above), it could be a great MI Clouds-style texture generator/beat masher/vocal mangler (would love to see that!).

That said, I admit I am biased against organ sounds, unless they're going through a really nice Leslie cabinet, so others may disagree.

a|x


#17

Have just finished testing the "dist/class a", and I believe as a bass player who likes very noisy and messy sounds, this is a massive improvement towards the idea of a quality Boost/overdrive/distortion goal. Maybe its because I am a noob at all this DSP stuff, but when the object is active and in play, it makes me feel like there is a lot of meat on the bone when looking for sound to better represent the dynamics of play.
In fact I am even happy just connecting it to one gain object when I normally have 2.
For the extreme test (limited to desk speaker), I split the audio into two lines, each with 2 gains each, one before and aft the "class a" - on max, and band pass each, one set high, the other low, and the sound got full and dirty, a lot better than I was expecting. Almost sounded like it wanted a mind of its own. I know this type of sound is not everyone's taste, but it was certainly enough to get me excited considering the struggles I have been having to create this. :grin:
Does this mean there is a Class B & C on the way.. ! :slight_smile:


#18

Further to my comments above, I have been thinking, what would be a good mod to this object, would be an adjustable level input, because I would like to have the drive level be adjustable in line with the envelope level, so at quieter levels it will be turned down automatically, or any other drive level formulae that may work.


#19

Ok I try to be patient :slight_smile: the idea sounds really promising. May I ask how the connection between the boards would be achieved?


#20

Update from the granular front, thee new objects and corresponding help patches:
* jt/granular/grainverb
* jt/granular/graindelay
* jt/granular/graintable
The number of simultaneous grains, length of the grains, and window shape is now configureable.
The code is also more documented, and I found a way around stealing the DMA channel from the GPIO serial port, by using the DMA2D engine instead. The old granular128 patch conflicted with use of the serial port on gpio, this issue is now fixed.