r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Sound] discussion about sound and audio implementation in REBOL

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
[57x2]
it's just support function
switch-range: func [number blk][
	foreach [rfrom rto action] blk [
		if not number? rfrom [rfrom: get rfrom]
		if not number? rto [rto: get rto]
		if all [number >= rfrom number < rto][return do action]
	]
]
Volker
16-Aug-2005
[59]
Is there a loop around that?
Rebolek
16-Aug-2005
[60x6]
yes there's a loop
I'm filling a buffer of 256 bytes so I can change parametres in realtime 
(buffer is filled, GUI works again, I can fiddle with knobs) and 
then I add buffer's content to some sound [block!]
buffer: context [
	length: 256
	data: make block! length
	init: does [
		data: make block! length
	]
	fill: func [fnc][
		init
		loop length [
			insert tail data do fnc
			data
		]
	]
]
then just >>insert tail sound buffer/data
but because there's no difference in speed of integer and FP math 
in REBOL, everything is done in FP sou it's needed to convert FP 
to 16-bit integer
sou=so
Volker
16-Aug-2005
[66]
math with fpu should be comparable in speed today. i try it.
Rebolek
16-Aug-2005
[67x2]
I'm using this code (and I really hope there's some better solution): 
>> insert tail sample do rejoin ["#{" skip to-hex to integer! (sample-value 
+ 1) * 32767.5 4 "}"]
If floating point is fast enough today, it's better to use FP because 
of resolution
Luca
21-Aug-2005
[69]
I know Rebol quite well but I don't know music. Can anybody point 
me to a white paper/tutorial/newbie docs/samples that explains how 
to valorize sound/data to play some notes? Thank you.
Rebolek
22-Aug-2005
[70]
luca: take a look at http://www.rebol.com/docs/sound.html, it's 
googd start. there are examples how to synthetize simple sine wavew 
and how to apply some envelope on it.
Luca
22-Aug-2005
[71]
Thank you, it is exactly what I was looking for.
Rebolek
23-Aug-2005
[72]
Bob Moog, inventor of famous synthesizers, died at age 71. Sad day 
for electronic music. http://www.moogmusic.com
Geomol
23-Aug-2005
[73]
Moog producs: http://www.moogmusic.com/detail.php
Amazing!
Rebolek
8-Sep-2005
[74]
Volker so you're interested what's possible with better sound? Me 
too. But I can tell you, what is possible with today's sound. This 
- http://krutek.info/pix/pdsynth.png;)))
Geomol
8-Sep-2005
[75]
That is soo cool! :-)
Volker
8-Sep-2005
[76]
Does the sound sound "green" like this? :)
Rebolek
8-Sep-2005
[77x3]
two or three things still missing: WAV saver, Vibrato and probably 
something else. At least WAV saver must be finished before release.
Sounds very green ;))
But it's slow. rebcode! will be great for this
Volker
8-Sep-2005
[80]
if you have something to translate to c, tell me.
Rebolek
8-Sep-2005
[81]
Volker lot of things, really :) I'd like to finish features mentioned 
above and then translate all computations to C. I'll let you now, 
thank you.
Volker
8-Sep-2005
[82]
Thanks :) maybe if you make it ready for c, i could do the rest. 
means make it use structures, not relying on contexts etc. for the 
time-critical things.
Anton
8-Sep-2005
[83]
Mmm.. nice picture...
Henrik
8-Sep-2005
[84]
kru, would you mind if we use this as a VID showcase in the Wikibook?
Rebolek
8-Sep-2005
[85]
Henrik why not. But the GUI is not 100% finished so I hope it can 
be later replaced with better picture.
Henrik
8-Sep-2005
[86x2]
will see if I can upload it in a few mins.
uploaded. if you get a new version with a new screenshot, you can 
upload it yourself, but you need an account to upload images... otherwise 
throw the link in the wikibook group
Ingo
14-Sep-2005
[88]
When I create a sound using Rebol, with 2 channels, is it possible 
to access the to channels independently? So as to create a stereo 
effect?
Rebolek
15-Sep-2005
[89]
You must create sound with stereo effect. Once you insert something 
to sound:// you lost control and cannot change even the volume.
Ingo
15-Sep-2005
[90]
OK, is there an example anywhere that shows how to create stereo 
sound? So far I haven't found one.
Rebolek
15-Sep-2005
[91x6]
http://www.rebol.com/docs/sound.html#section-7
For sound samples with two channels both channels are interleaved, 
i.e. samples for each channel alternate within the binary.
Example based on example in Carl's sound guide:
print "Generating sound..."
    bounceL: #{}
	bounceR: #{}
    repeat modulate 20 [
        delta: negate log-2 modulate
        for amplitude 400 1 delta [
            for phase 1 360 16 [
                val: 128 + to-integer 127 * sine phase
                val: amplitude * val / 400
                append bounceL to-char val
				append bounceL to-char 400 - val
            ]
        ]
    ]

	bounce: #{}
	repeat i 400 [
		insert tail bounce bounceL/:i
		insert tail bounce bounceR/:i
	]

    ; Set up the sound sample parameters:
    sample: make sound [
        rate: 44100 / 2
        channels: 2
        bits: 8
        volume: 0.5
        data: bounce
    ]

    ; Play the sound now:
    sound-port: open sound://
    insert sound-port sample
    wait sound-port
    close sound-port
The problem is that it does not work (at least here).
And here's why: