World: r3wp
[Sound] discussion about sound and audio implementation in REBOL
older newer | first last |
Rebolek 27-Jun-2005 [8x4] | bug probably? |
I've changed example from documentation to produce 16bit sound instead of 8bit | |
print "Play a simple tone..." ; (init event system too) ; Generate a sine wave tone (1 cycle of the wave): tone: #{} for phase 1 360 6 [ val: 32768 + to-integer 32767 * sine phase repend tone [to char! to integer! val / 256 to char! to integer! val // 256] ] ; Set up the sound sample parameters: sample: make sound [ rate: 44100 channels: 1 bits: 16 volume: 0.5 data: #{} ] ; Repeat the sine wave for 1000 cycles: loop 1000 [append sample/data tone] ; Play the tone now: ? sample sound-port: open sound:// insert sound-port sample ? sample wait sound-port close sound-port | |
it still changes resolution to 8bit and channels to 2 | |
Vincent 27-Jun-2005 [12] | sound has a lot of problems: the .wav data source is modified at loading a low-q sample seems to force a permanent low-q to all successive samples samples are adapted (=modified) to audio capabilities at first use, if 'rate or 'bits are not the default values. the only way to play samples without these problems is to: - open the sound port - insert a copy of the sample/sound object - close the port for each sound. |
Anton 27-Jun-2005 [13] | Yes, I have already found this "modification" problem. |
Rebolek 27-Jun-2005 [14x2] | IMO this modification - if it's needed - should be invisible to user |
coz it's really confusing me | |
Anton 27-Jun-2005 [16] | The modification keeps happening, if you play different samples alternately, each sample is modified randomly, converted to a random mode. Gradually the sample becomes noisy due to rounding errors in the conversions. |
Rebolek 27-Jun-2005 [17] | yes, it's modified randomly, I've done some test but the results were different all the time so I felt lost |
Gregg 27-Jun-2005 [18] | This is a known issue. RT wants to address sound at some point, but I'm not sure where it falls in the priority queue. |
Jean-François 14-Aug-2005 [19x2] | Here an article that could be usefull someday http://dafx04.na.infn.it/WebProc/Proc/P_201.pdf |
By way of Christian's site | |
Rebolek 15-Aug-2005 [21] | unfortunately there's missing page 2 in the document. however if anybody is interested in synthesis, next version of sintezar is going to have five different oscilators, four filters, three waveshapers (these units are ready now) plus some other units (phaser is ready, i'm working on delay). I wrote some basic sequencer last week, so only some preset management system is missing and some work on GUI (drag and drop for connecting modules is ready, but I still have to rewrite all modules to support it) |
Anton 15-Aug-2005 [22] | Sounds good Kru, would like to look at it when you're ready. |
Rebolek 15-Aug-2005 [23] | Antor if you're interested, here's a screenshot of work in progress - http://krutek.info/pix/sintezar.jpg |
Anton 15-Aug-2005 [24x2] | Very nice looking ! May I criticise your knobs though ? They are a bit big. Before long, you won't have any room left ! :) I suggest make them half the size in width and height. |
But very good. Inspirational, indeed. | |
Benjamin 15-Aug-2005 [26] | i love those fancy bars from winamp or wmp how they do that ? how they get the khz and hz and all that from the wav file ? suposing it is a wav ... (raw or pcm) |
Rebolek 16-Aug-2005 [27] | fast fourier transformation. no way in current rebol (to much computations). On my Athlon XP 1700+ can REBOL do some 3milions computations in second (this is very aproximate number, some computaions are more time-consuming than other ). May sound like a big number, but if sound's sample rate is 44100Hz, there's only some 70 computations for each sample. And this is the ideal situation (no GUI and other CPU-demanding stuff). So there are two possibilities. 1) Some faster math, or JIT REBOL compiler and 2) wait for faster CPU's. Let's see what comes first. |
Anton 16-Aug-2005 [28] | (He he he....) |
Pekr 16-Aug-2005 [29x2] | first comes faster CPUs :-) What about producing language extension? Ah, we did not get any yet, sorry, I forgot, it is long time we were promissed to get those ;-) Hmm, but what about external library calls? Could do the trick, no? If you use gcc, you should be able to compile for main platforms at least ... |
JIT (VM) for some specific tasks could be sufficient too, but we can only hope here. The only realistical thing is to use what we have now - other tool than REBOL ;-), or library calls .... | |
Rebolek 16-Aug-2005 [31] | Pekr yes, external library call can solve it (partially). I have to install some C/C++ SDK and start to learn it again... |
Pekr 16-Aug-2005 [32] | I worked with image data in external library, was not all that difficult. Forget C ++, use C. But then - image data is just repetitive pattern of RGBA values, so maybe working with sound data will be much more difficult ... |
Volker 16-Aug-2005 [33] | Can you write prototype in rebol, and i try my c-skills? |
Rebolek 16-Aug-2005 [34] | sorry, what prototype? |
Pekr 16-Aug-2005 [35] | Syntezar's? |
Volker 16-Aug-2005 [36x2] | that needed c-part, fft. |
i don't know the math, but i may be able to translate rebol to c. | |
Rebolek 16-Aug-2005 [38] | there's fft C library, http://www.fftw.org/ |
Volker 16-Aug-2005 [39] | so you only need stubs? |
Rebolek 16-Aug-2005 [40x3] | but I haven't tried it yet. |
No I probably have to rewrite all my routines to C. I haven't started working on FFT at all. | |
I've got phase-distortion oscillator, FM oscillator, wavetable oscillator and my exponential oscillaor plus four types of filters and it's really time consuming in REBOL | |
Volker 16-Aug-2005 [43] | Can i try t translate that? |
Rebolek 16-Aug-2005 [44] | That should be great |
Volker 16-Aug-2005 [45] | Where to start? |
Rebolek 16-Aug-2005 [46] | you can try this Phase Distortion I wrote yesterday |
Volker 16-Aug-2005 [47] | where do i find it? |
Rebolek 16-Aug-2005 [48x2] | osc: context [ phase: 0 AM: 1 ;Amplitude modulation PWM: 0.5 ;Pulse width modulation DCW: .5 ; phase transition between sine and other wave [0 - 1] wave-length: 400 ;wave-length is sample-rate / frequency - don't wanna have samplerate here algorithms: [ saw [ d: (1 - dcw) / 2 cosine 360 * switch-range ph [ 0 d [ph * (pwm / d)] d 1 [(ph - d / (1 - d)) * pwm + pwm] ] ] square [ d: 1 / max 1e-50 (1 - dcw) cosine 360 * switch-range ph reduce [ 0 .25 [ph * 4 ** d / 4] .25 .5 [(abs ph - .5) * 4 ** d / 4 + .5] .5 .75 [ph * 4 - 2 ** d / 4 + .5] .75 1 [(abs ph - 1) * 4 ** d / 4 + 1] ] ] triangle [ ;triangle is d~.588888 d: 1 - (dcw * .41111) ;1 / max 1e-50 (1 - dcw) cosine 360 * switch-range ph reduce [ 0 .25 [ph * 4 ** d / 4] .25 .5 [(abs ph - .5) * 4 ** d / 4 + .5] .5 .75 [ph * 4 - 2 ** d / 4 + .5] .75 1 [(abs ph - 1) * 4 ** d / 4 + 1] ] ] ] algorithm: 'saw curves: copy [] forskip algorithms 2 [append curves to string! algorithms/1] phaser: func [][ phase-per-byte: 1 / wave-length phase: phase + phase-per-byte if phase > 1 [phase: phase - 1] phase ] wave: func [ ][ ph: phaser do select algorithms algorithm ] |
right here ') | |
Volker 16-Aug-2005 [50] | Thats the right size to refresh my knowledge :) |
Rebolek 16-Aug-2005 [51x5] | PWM should be always 0.5 (it's from some older version) |
it supprots three different waveform (still six missing to recreate my CasioCZ ;) | |
basics are 'phaser function - updates oscillator phase | |
and wave function - produces actual sound | |
with DCW you control shape of waveform. DCW-0 is sine waveform, DCW-1 is (square, saw, triangle) | |
Volker 16-Aug-2005 [56] | where does switch-range come from? |
Rebolek 16-Aug-2005 [57] | it's just support function |
older newer | first last |