Open303 - open source 303 emulation project - collaborators wanted

DSP, Plugin and Host development discussion.
Post Reply New Topic
RELATED
PRODUCTS
JC-303

Post

antto wrote:Robin: btw, my sequencer uses a very compact pattern storage, a whole pattern of mine wastes only 33 bytes, and there are additional non-303 stuff (extras) like the step length per step
step-length per step - interesting idea. i currently have only a macro steplength parameter (for all steps at once). perhaps, one could even have both by just defining them as step-length multipliers.
the format of my patterns is binary, each on/off value is a single bit, it was a bitwise exercise for me ;P~ quite fun
my main concern currently is not the most economic way of storing patterns but the protocol for manipulating patterns through the VST interface (via setParameter). for my own derivative-synth (which won't rely on that VST-way of passing information from GUI to the core), i'll probably go with xml-based storage as i do in all my plugins. although, the storage format does not really have anything to do with the manipulation protocol. however, life is too short to juggle with single bits :P
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

not sure i understand all that..
i have my steps in structures, both in storage and manipulation format
which is very handy

struct step { mbyte x,y; };
// this holds the two bytes that store all data for 1 step

struct step2
{
bool gate,accent,slide;
mbyte note,length;
};

i convert between "step" and "step2" structures, i work with "step2" and store the result as "step"
the functions for converting between these are ugly (macros, bitwise crap..)

yeah, i have step length per each step, it's range is from 1/8 to 8/8
it's not something big, but it can make some swingish/funkyish feel to some patterns
it has no effect on slided notes, since the length there is always 8/8 (full)
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.libera.chat >>> #kvr

Post

Robin from www.rs-met.com wrote:
Download: Open303-g.7z
link did not work for me
Sorry about that, link fixed ... download open303-g.rar
Robin from www.rs-met.com wrote:
asseca wrote: apparently it is by implementing a notes/steps grid consisting of 13 notes x 16 steps, resulting in the use of 208 parameters. Each grid "point" allows for "off","on","Transpose 1+","Transpose 1-","Glide","Accent". By using 16 values for each parameter all combinations are possible ...
mmm...so would you suggest to use VST-parameters to encode the sequencer state? mmm - maybe 16 parameters for the pitches of the 16 steps (where the pitch is encoded as 1.f/127.f - perhaps with zero indicating 'off' state)...and another 16 paramters to encode the the 4 possible combinations of glide and accent (as 0.f, 0.25.f, 0.5f, and 1.0f)? that would make fo 32 additional parameters to include in the vst-dll. not really what i would call a clean design but perhaps a workable solution.
Yes it is a bit primitive, but mGUI can directly fill the matrix from a 13 by 16 matrix. 208 parameters is only 832 bytes which should not be a problem. Each grid point parameter can have 13 values: (which is basically a knob-strip)Image[edit]updated, now when clicking inside the grid, a yellow focus-rectangle will appear, using the cursor keys you can move to grid-points and change the grid-point value with SPACE, num +, num - [/edit]

Post

(besides the first)

wdf. really? it misses the first note?
@#????

how can that be? there must be some kind of
explanation for that. what if you copy it twice?
drops another note?
if you copied it 16 x, no notes?

1/length per step is a mc202 feature(ok tho')
2/you could combine original display with userfriendly
display with flip panels+2way function/display

Q: how do you avoid patterns forming with pseudo-randoms?
(Q:what's the problem with dotnetfx?)

robin: a/b'd acidevil 1+2, and, hey it sounds nice. 2 is more
organic, and has a bit of growl/wapp-but could go further-but the
decay doesn't seem to work at all. the slide time is wrong/too long?
makes the tuning sound weird.
accent attk on v1 is fun. would be good with (lfo). all round..well, they're
quite different really.

everyone read this?
http://www.geuggis.com/tb-303/art06.htm

Post

mztk wrote:(besides the first)

wdf. really? it misses the first note?
@#????

how can that be? there must be some kind of
explanation for that. what if you copy it twice?
drops another note?
if you copied it 16 x, no notes?
its been a long time but most likely has something to do with with unused or double used adress pins on the memory IC, and the way the memory is mapped/assigned

It could go a bit like this:
it keeps the pointer to the first note, but as you cleared the pattern and there's no time mode nor pointers to any other notes, as soon as you change pattern and go back to the destination it will retain the pointers from the source pattern, appart from the first pointer.

or something like that.. it's been a few years since i've learned how memory chips worked :wink:

I should get myself some logic probes and check out what's happening, afaik the service manual doesn't go into detail.

the memory thing gets totally crazy in track mode, you can chain patterns and do stuff with them, but as soon as you make your track too long or anything it totally f*cks up everything. there's 7 tracks you can store and most of them vary in available 'length', this is documented in the manual but can get very confusing once you start chaining tracks, thus writing from track to track without setting an end point.. Esp. if you make a mistake and it screws up an hour of manual track mode input :cry: (yes, I've made some insane creations in track mode)

Wow, now I made it sound like it isn't any fun at all :D
Most acid doesn't use track mode so...

Post

I have been separating the graphics from the graphics engine. If you can send the parameters as text spreadsheet style I have the graphics for it. I have been testing it on csound and some programming languages. I also have some nearly finished drum machine graphics...
http://dextracker.blogspot.com/
tracker for csound, free basic and some other stuff I forgot.

Post

Dexrow synths wrote:I have been separating the graphics from the graphics engine. If you can send the parameters as text spreadsheet style I have the graphics for it. I have been testing it on csound and some programming languages. I also have some nearly finished drum machine graphics...
i don't really understand that offer - what do mean by separating graphics from the graphics engine?
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

meanwhile, i'm experimenting with nonlinearities..
inspired by a bunch of articles about diodes 'n' stuff..
i'm definately not doing wierd math to derive digital simulation of circuits or components
..but what i did so far is something different, interesting, and to me, it sounds very pleasing.. less digital, more analogish
i'm still tweaking and altering a bunch of algorithms, but i can upload an audio demo these days, if you wanna hear it

basicaly, it is inspired by a statement that diodes are not just plain-shapers, but have something like "memory"
i didn't read the whole article, and didn't paid a lot of attention (so i might have got it all wrong) .. and i didn't understand 80% of what i read..
but the whole thing started to look to me like a little LP-flavour inside the nonlinearity, so here's what i did:

i made a little clipper algo, it's perfectly (or maybe relatively) linear between -0.5 and +0.5
beyond that, it softly limits the amplitude
now, the interesting thing is that there are 2 1-pole LP filters, one for the negative and the other for the positive halfwaves
the result is pretty cool, when the LPFs react slower - most of the signal "leaks" at first..
now this might look like some kind of foldback distortion, yes..
..but not quite.. since the "folding" is frequency dependant now
at least this is how i understand it, oh well, it sounds very good on a 303
when the gain is very high, and the 303 filter is low, it adds nice little edges all around, sounds familiar ;]
but as the 303 filter freq increases, it doesn't distort it that much, because it "leaks" ..

the algo itself is kinda big for just a replacement of atan() (for example)
i'm testing it as a distortion on my synth, but i am about to put it in the filter now, i have a feeling it'll be sick ;]
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.libera.chat >>> #kvr

Post

typo graphics from the audio engine.. sorry that way one graphic program can be used with several audio engines.

http://pypi.python.org/pypi/colin1911/.99%20version%203
http://dextracker.blogspot.com/
tracker for csound, free basic and some other stuff I forgot.

Post

my previous Filter envelope (RC) curve shaper was too sharp
i used a sample from dinsync.info, sonogram, extract datapoints, convert to exponential input (RC) and here's the new shaper:

Code: Select all

	inline double fenv303rc3(const double &rc)
	{
		// 22/02/2010
		const double x = (rc * 1.0001584);
		const double x2 = x*x;
		const double x4 = x2*x2;
		return (0.88858153 * x +
				-1.570779 * x2 +
				4.9999364 * x2 * x +
				-5.4121539 * x4 +
				2.094166 * x4 * x);
	}
the RC-decay coefficients must be rescaled again

Code: Select all

exp(-1.0 / (0.09 * (decmin + (1.0 - ACC) * dcy * (decmax-decmin)) * Fs))
where decmin = 0.341
decmax = 4.561
dcy is the decay parameter (knob) 0 to 1.0
and ACC is the accent signal from the sequencer (0=normal,1.0=accented)

0.09 approximates rv0's TB-303 (and most other units seem to have the same response)
compared to Josh Wink's HSoC track (if it's a TB-303 playing there..) the scaling is more like 0.211

i also think i'm gonna revisit my old knob measurement (this: [url=http://www.box.net/shared/o83p6n1ju9]TB-303_FEnv_anlz_01.jpg[url])
i suspect it might be slightly incorrect now

rv0: i was thinking..
once you program a pattern in the TB, say 7 notes, can you "insert" a note in the middle between note3 and note4?

and i also *think* i figured a way to make a consistent way to at least program a pattern the 303-way, on our non-303 sequencers (for example, mine)

so, in the TB-303 the user first enters _notes_ .. then time mode (G O -) and then note properties (U/D,A,S)
the UDAS info is per each Note, and each Note occures when there is a "G" in time mode, and is extended when there is a "O"
"-" adds a pause, and the "slide" only connects this note with the next one

in contrast, our patterns are just arrays of Pitch, Gate/Accent/Slide values
it is perfectly possible to program the same pattern here too, but somewhat in a different way

so here's my idea

the equivalent of PitchMode would be simple
each key pressed by the user is stored in the Pitch array

then, Time mode
each "G" takes a note.. okay
a "-" would "shift" the remaining "Pitches" so that next time there is a "G" it would take the "next" Pitch, kinda confusing at first
"O" would be only possible if there is a "G" or "O" before that
and it will shift the remaining "Pitches" just like the "-"
during all these "shifts" the last pitch values would be lost

then the UDAS information
here, the user presses Next/Back buttons to navigate thru the pattern
each time one of these buttons is pressed, steps that don't have a "Gate" should be skipped till one that has is found

now, some graphical examples might be a lot clearer than my explanations:


scenario:

Code: Select all

>>>	PM: c c C d#

[c ][c ][C ][d#][__][__][__][__][__][__][__][__][__][__][__][__]

Code: Select all

>>>	TM: G - G O G G

the first G takes the first "c"
[c ][c ][C ][d#][__][__][__][__][__][__][__][__][__][__][__][__]
|g..|...|...|...|...|...|...|...|...|...|...|...|...|...|...|...
length = 1

Code: Select all

the "-" pushes the rest of the pitches
[c ][--][c ][C ][d#][__][__][__][__][__][__][__][__][__][__][__]

Code: Select all

the second "G" takes the 3rd pitch, which is now the "c"
|g..|...|g..|...|...|...|...|...|...|...|...|...|...|...|...|...
length = 3

Code: Select all

the "O" shifts the rest of the pitches, and adds a slide
[c ][--][c ][--][C ][d#][__][__][__][__][__][__][__][__][__][__]
|g..|...|g..|..s|...|...|...|...|...|...|...|...|...|...|...|...
length = 4

Code: Select all

the last two Gs get the next notes and the result is:
[c ][--][c ][--][C ][d#][__][__][__][__][__][__][__][__][__][__]
|g..|...|g..|..s|g..|g..|...|...|...|...|...|...|...|...|...|...
length = 6
>>> UDAS
here user presses Next/Back.
in the example pattern, the possible positions that can be viewed are:

Code: Select all

|g..|...|g..|..s|g..|g..|...|...|...|...|...|...|...|...|...|...
  ^       ^       ^   ^
four!

so a Slide with no Gate is equivalent of "O" in time mode

now, i'm not sure what happens when slides are entered with the UDAS info

Code: Select all

for example if the user adds a slide on the "C" - it's very simple:
[c ][--][c ][--][C ][d#][__][__][__][__][__][__][__][__][__][__]
|g..|...|g..|..s|g.s|g..|...|...|...|...|...|...|...|...|...|...
                  ^
what happens when he adds a slide on the second "c" ?
one thing that goes thru my mind is:

Code: Select all

[c ][--][c ][--][C ][d#][__][__][__][__][__][__][__][__][__][__]
|g..|...|g..|..s|g..|g..|...|...|...|...|...|...|...|...|...|...
          ^
[c ][--][c ][C ][--][d#][__][__][__][__][__][__][__][__][__][__]
|g..|...|g.s|g.s|..s|g..|...|...|...|...|...|...|...|...|...|...
which will be like connecting the "c" (where the slide has to be) with the next note,
in this case, it's after a gap, so wi shift everything forward
then an "O" remains in the original TM information, so maybe add that back after the slide
in this case, after the "C"
:shrug:

EDIT: and by the way
what happens if you program 16 notes in PM, and then you press all 15 "G" and one "O" ?
i know the 303 sequencer is restricted up to 16 steps-long patterns, tho the memory can store a bit more..
but how is the restriction applied?
is timemode compared to match the equivalent of 16 steps?
and if you later replace the "O" with a "G" .. will the remaining steps "shift" toward the "whole" :shock:
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.libera.chat >>> #kvr

Post

i just ploted a RC envelope to see how the original coefficients calculation works
exp(-1 / (tau * Fs))
sampled at 400Hz (the resolution of my plot actually) for 1 second, the RC decays to about ~0.356 (tau=1.0)
altho a RC doesn't ever decay to 0.0 in theory, there is a point where it is relatively quiet, and looks like it's over..
for a one second decay, i figured tau=0.125 to be a good value

so, converting my measured decay times for the 303 Filter Envelopes, the result approximates to 0.25 (min) and 3.25 (max) which looks better ;]
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.libera.chat >>> #kvr

Post

Antto, if you enter a slide between two (same) pitches then these will be converted to a G and a O using your notation. They are actually stored as two pitches with a slide but as soon as you step your way thru a pattern they will be converted so you never see them as two of the same pitches with a slide between them. This means your pattern is effectively packed to occupy as small space as possible, even though there is enough space in the 303's memory to store individual notes for all the patterns.

Post

hello Mike ;]

so, if i do:

Code: Select all

PM: c c
TM: G G - -
..: S -
it will be stored as:

Code: Select all

PM: c
TM: G O - -
..: - -
correct?

now if i have:

Code: Select all

PM: c d e C
TM: G O O - G -
..: S - A -
grr, this already looks complicated..

i can think of at least two different ways that could be handled, here's one:

Code: Select all

PM: c d - - e
TM: G G O - G -
..: S - - - A -
this would be the equivalent of:

Code: Select all

[c ][d ][--][--][e ]
|g.s|g..|...|...|ga.
5 steps .. and the last "C" note that was entered is unused

my next chalange (after figuring how it works) would be to figure a consistent way of converting between this 303-style pattern storage, and our usualy array-of-steps

i was watching some videos, how some more experienced guys program patterns on that thing is really amazing, they're so fast, and it looks so easy
while i still like to have the benefits of the "array-of-steps" world, where i can shift and twist, reorder and do whatever crazyness i like without loosing too much of the pattern (what i guess the "303-optimization" does)

it'll be nice to at least provide a way to "enter" the pattern in a 303 way, and when the pattern is ready - this 303 mode would be switched off, and the pattern would actually be converted to the array-of-steps format and stored

i was messing around at the Ultra303 site, where this guy has developed a replacement sequencer, and i'm pretty sure he knows all about the original 303 sequencer, and how it works, i tryied to email him, but he rejects any mails..
i am curious, if that custom sequencer stores the patterns in the same format as the original sequencer on the TB..
it kinda has most of the functionality that is on my TODO list, that i think would be _pain_ (if not impossible) to make, if i use the same 303 pattern format..
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.libera.chat >>> #kvr

Post

antto wrote:hello Mike ;]

so, if i do:
PM: c c
TM: G G - -
..: S -
it will be stored as:
PM: c
TM: G O - -
..: - -
correct?
Yes.

Code: Select all

PM: c d e C 
TM: G O O - G - 
..: S - A - 
I don't think you can enter this on a 303 because the Accent cannot be on a O-step. It has to be on a G-step. I think you should keep the UDAS flags combined with the pitches in your notation, since it makes it easier to read.

PM: c(S) d e(A) C
TM: G O O - G -

This would only play the two first notes c(S) and d on the 303. However I'm not sure what happens with the slide on the first note. I suspect it gets reset to a simple c since you cannot slide when there is a pause in between. I'll have to check with my 303 when I get back to the office.

Also, check out ABL2's 303 style programming mode found in the preferences screen. I tried to mimic the 303 sequencer as closely as possible with the exception that I do not compact the patterns and also the time and pitch modes are more closely related. But the rules are the same.

--Mike
Last edited by Mike Janney on Mon Feb 22, 2010 1:42 pm, edited 1 time in total.

Post

one more odd question

Code: Select all

PM: c c f
TM: G G G -
..: S - -
here the slide from "c" to "c" would be optimized into a "tie" like the previous example
but what happens with the third "G" .. will it take the second "c" pitch, or the "f" ?
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.libera.chat >>> #kvr

Post Reply

Return to “DSP and Plugin Development”