addExtension (authoringSpecs) 'Sound Samples' (array (array 'r' 'getSamples' 'get samples from _' 'str.soundMenu') (array ' ' 'makeNewSound' 'make new sound named _ from _ ' 'string array' 'newsound' nil) (array ' ' 'playSamples' 'play samples in _' 'array' nil) (array 'r' 'mixSamples' 'mixed samples from _ and _ : and _ : and _' 'array array array array' nil nil nil nil) (array 'r' 'silenceSamples' 'silence for _ seconds' 'num' 1.0) (array 'r' 'spliceSamples' 'spliced samples from _ and _ : and _ : and _' 'array array array array' nil nil nil nil) (array 'r' 'scaleSamples' 'scaled by _ samples _' 'num array' 1.0 nil) (array 'r' 'stepSample' 'sampled by step _ from _' 'num array' 1.0 nil) (array 'r' 'segmentSamples' 'segment of _ seconds from _ : starting at _' 'num array num' 1.0 nil 1) ) to getSamples snd { if (isClass snd 'String') { // argument is the name of a sound proj = (projectForMorph (morph (implicitReceiver))) if (notNil proj) { snd = (soundNamed proj snd) } } if (not (isClass snd 'Sound')) { return } allsamples = (list) for i (samples snd) { add allsamples (i / 32767.0) } return (toArray allsamples) } // (array ' ' 'setSamples' 'set samples in _ to _' 'str.soundMenu array') // Doesn't quite work yet to setSamples snd newsamples { if (isClass snd 'String') { // argument is the name of a sound proj = (projectForMorph (morph (implicitReceiver))) if (notNil proj) { snd = (soundNamed proj snd) } } if (not (isClass snd 'Sound')) { return } setField snd 'samples' newsamples oldsamples = (samples snd) for i (count oldsamples) { atPut oldsamples i ((at oldsamples i) * 32767.0) } } to makeNewSound name oldsamples { if (isNil isStereo) { isStereo = false } if (isNil name) { name = '' } snd = (new 'Sound') newsamples = (list) for i (count oldsamples) { add newsamples (truncate ((at oldsamples i) * 32767.0)) } setField snd 'samples' (toArray newsamples) setField snd 'samplingRate' 22050 setField snd 'isStereo' false setField snd 'name' name proj = (projectForMorph (morph (implicitReceiver))) add (sounds proj) snd } to oldplaySamples samples { openPortAudio len = (count samples) i = 1 while (i < len) { bufsamples = (list) bufcount = 0 while (and (bufcount < 1024) (i < len)) { add bufsamples (at samples i) i = (i + 1) bufcount = (bufcount + 1) } waitForAudio writeAudioData (toArray bufsamples) } closePortAudio } to playSamples oldsamples { if (isNil isStereo) { isStereo = false } if (isNil name) { name = '' } snd = (new 'Sound') newsamples = (list) for i (count oldsamples) { add newsamples (truncate ((at oldsamples i) * 32767.0)) } setField snd 'samples' (toArray newsamples) setField snd 'samplingRate' 22050 setField snd 'isStereo' false setField snd 'name' 'anonymous' proj = (projectForMorph (morph (implicitReceiver))) // add (sounds proj) snd player = (soundPlayer (global 'page')) addSound player snd while (isPlaying player snd) { waitForNextFrame} } to mixSamples s1 s2 s3 s4 { allsamples = (list) if (notNil s1) { for elem s1 { add allsamples elem }} if (notNil s2) { len = (min (count allsamples) (count s2)) for i len { element1 = (at allsamples i) element2 = (at s2 i) atPut allsamples i (element1 + element2) }} if (notNil s3) { len = (min (count allsamples) (count s3)) for i len { element1 = (at allsamples i) element2 = (at s3 i) atPut allsamples i (element1 + element2) }} if (notNil s4) { len = (min (count allsamples) (count s4)) for i len { element1 = (at allsamples i) element2 = (at s4 i) atPut allsamples i (element1 + element2) }} return (toArray allsamples) } to spliceSamples s1 s2 s3 s4 { allsamples = (list) if (notNil s1) { for elem s1 { add allsamples elem }} if (notNil s2) { for elem s2 { add allsamples elem }} if (notNil s3) { for elem s3 { add allsamples elem }} if (notNil s4) { for elem s4 { add allsamples elem }} return (toArray allsamples) } to silenceSamples secs { if (secs < 0) {error 'No negative silence'} allsamples = (list) for i (truncate (secs * 22050)) { add allsamples 0 } return (toArray allsamples) } to scaleSamples rate s1 { allsamples = (list) for i (count s1) { add allsamples (rate * (at s1 i)) } return (toArray allsamples) } to stepSample step s1 { allsamples = (list) if (step == 0) {error 'No zero steps allowed'} if (step >= 0) { i = 1 while (i <= (count s1)) { add allsamples (at s1 (truncate i)) i = (i + step) }} if (step < 0) { i = (count s1) while (i >= 1) { add allsamples (at s1 (truncate i)) i = (i + step) }} return (toArray allsamples) } to segmentSamples dur s1 start { if (dur <= 0) {error 'Duration must be positive'} allsamples = (list) if (isNil start) {start = 1} if (notNil s1) { i = start end = (truncate (dur * 22050.0)) while (i <= (start + end)) { add allsamples (at s1 i) i = (i + 1) }} return (toArray allsamples) }