How to get into synth / executable music?
category: music [glöplog]
i implemented "alias free" waveforms in an older synth of mine a few years back by creating wavetables for each waveform and each midi note by adding all valid harmonics and applying gibbs correction (so essentially 128 tables per waveform)
for each tick in the oscillator the appropriate table was selected by a frequency lookup table. so if FM was applied it would just use the corresponding table as it would without FM.
sounded ok to me, or am i just thinking too simple here?
for each tick in the oscillator the appropriate table was selected by a frequency lookup table. so if FM was applied it would just use the corresponding table as it would without FM.
sounded ok to me, or am i just thinking too simple here?
After Smash said his synth wasn't bandlimited, I thought I'd have a go at not bandlimiting it and generating 4 triangle waves simultaneously with SIMD.
It sounded bloody awful :-) It's ok with just one oscillator, but when you add 4 together it sounds like there's an aircraft taking off in the background.
It sounded bloody awful :-) It's ok with just one oscillator, but when you add 4 together it sounds like there's an aircraft taking off in the background.
gopher: What do you do about detune? Pitch bend? :-) But yes, it's a valid way, except it's probably slightly more flexible to make the tables a function of frequency and not note number.
For FM, it should be fine(-ish) for small frequency changes; not so fine for large frequency changes.
For FM, it should be fine(-ish) for small frequency changes; not so fine for large frequency changes.
To test my oscillators I do a slow frequency sweep. Half of the aliasing products will move in the opposite direction (frequency) with respect to the sweep direction. You'll immediately hear the aliasing; it's very unforgiving :)
sesse: uhm ... detune and the like are all added up to give a frequency value. something like:
wrkfreq = note_freq * pow(2.0, transpose + detune + glide)
then do the phase integration:
wrkphase += wrkfreq + freq_mod
then doing the table lookup based on (wrkfreq + freq_mod) and use that table for reading the wave at wrkphase
so essentially everything changing the frequency of the sound is considered when doing the wavetable lookup to get the table with the correct amount of harmonics.
wrkfreq = note_freq * pow(2.0, transpose + detune + glide)
then do the phase integration:
wrkphase += wrkfreq + freq_mod
then doing the table lookup based on (wrkfreq + freq_mod) and use that table for reading the wave at wrkphase
so essentially everything changing the frequency of the sound is considered when doing the wavetable lookup to get the table with the correct amount of harmonics.
OK, sure, you just sounded like you never considered anything but the table equivalent to the base note number.
First post!
I wonder if it is possible to optimize a synth for output directed at 30 year olds? I mean, there is bound to be some hearing loss from age and techno music listening history. The human hearing range is from 20Hz to 20KHz for a human super ear man, but maybe you don't really need to have a sample rate of double that frequency to please. Anyone know what is the correct sample rate for drunk 30 year olds?
I think it depends on which drunk 30 year old you sample ;)
Loaderror, that's a pretty good insight, thanks! You just halved the precalc time of our future intros ;)
loud blast of noise at start, then basically play whatever you want between 200 and 2000hz, given that's the remaining hearing range for the people present :D
Gargaj: Or just make sure it's lug00ber at the mixer, in which case you don't need the loud blast.
gopher:
n = note + slide_offset + portamento_offset + detune + tuning + arp_offset;
freq = powf(2.0f, n + Constants::NoteOffset / 12);
:P
Keeping track of frequencies in this thing is a nightmare.
n = note + slide_offset + portamento_offset + detune + tuning + arp_offset;
freq = powf(2.0f, n + Constants::NoteOffset / 12);
:P
Keeping track of frequencies in this thing is a nightmare.
I usually do:
[code]
n = note + analog_drift + domination_offset + secret_parameter;
freq = powf(2.0f, n + Constants::NoteOffset / 12);
[\code]
[code]
n = note + analog_drift + domination_offset + secret_parameter;
freq = powf(2.0f, n + Constants::NoteOffset / 12);
[\code]
I usually do:
Code:
if (!(rand() & 10)
Doh, I spoiled my joke by accidently hitting submit before I got to the punchline :(
Knock knock!
Knock knock!
Who's there?
Wave
Wave who?
WAVE GOODBYE TO YOUR SYNTH!!!!!!!!!!!!!
Its ok, I have my samples.
"it was better with module files" etc.
Dude, it all went down... :(
Bidule: http://www.youtube.com/watch?v=uH3pF3esMj0