[squeakdev] The Trunk: Soundeem.83.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Oct 23 22:52:29 UTC 2021
Eliot Miranda uploaded a new version of Sound to project The Trunk:
http://source.squeak.org/trunk/Soundeem.83.mcz
==================== Summary ====================
Name: Soundeem.83
Author: eem
Time: 23 October 2021, 3:52:26.745004 pm
UUID: bb4ab1c4cd3145f280b80b8a76870de8
Ancestors: Soundct.82
Avoid busy loop in playAndWaitUntilDone
Use Float64Array in FWT.
=============== Diff against Soundct.82 ===============
Item was changed:
 Method: AbstractSound>>playAndWaitUntilDone (in category 'playing') 
playAndWaitUntilDone
"Play this sound to the sound ouput port and wait until it has finished playing before returning."
+  duration timeTaken delay 
+ duration := [self duration] on: MessageNotUnderstood do: [:ex SmallInteger maxVal].
+ timeTaken := Time utcMicrosecondClock.
self play.
+ timeTaken := Time utcMicrosecondClock  timeTaken // 1000.
+ duration > timeTaken ifTrue:
+ [delay := Delay forMilliseconds: (SoundPlayer bufferMSecs min: duration  timeTaken).
+ [self samplesRemaining > 0] whileTrue: [delay wait]].
+ (Delay forMilliseconds: SoundPlayer bufferMSecs) wait "ensure last buffer has been output"
+
+ "AndreasSystemProfiler spyOn: [PluckedSound bachFugue playAndWaitUntilDone]"!
 [self samplesRemaining > 0] whileTrue.
 (Delay forMilliseconds: 2 * SoundPlayer bufferMSecs) wait. "ensure last buffer has been output"
 !
Item was changed:
 Method: FWT>>doWaveDemo (in category 'testing') 
doWaveDemo "FWT new doWaveDemo"
"Printing the above should yield a small number  I get 1.1e32"
 originalData 
self nSamples: 312 nLevels: 3.
self setAlpha: 0.0 beta: 0.0.
"Install a sine wave as sample data"
+ self samples: ((1 to: nSamples) collect: [:i  ((i1) * 0.02 * Float pi) sin] as: Float64Array).
 self samples: ((1 to: nSamples) collect: [:i  ((i1) * 0.02 * Float pi) sin]).
originalData := samples copy.
FFT new plot: (samples copyFrom: 1 to: nSamples) in: (0 at 0 extent: nSamples at 100).
"Transform forward and plot the decomposition"
self transformForward: true.
transform withIndexDo:
[:w :i 
FFT new plot: (w copyFrom: 1 to: w size5)
in: (i1\\2*320@(i+1//2*130) extent: (w size5)@100)].
"Test copy out and read in the transform coefficients"
self coeffs: self coeffs.
"Ttransform back, plot the reconstruction, and return the error figure"
self transformForward: false.
FFT new plot: (samples copyFrom: 1 to: nSamples) in: (320 at 0 extent: nSamples at 100).
^ self meanSquareError: originalData!
Item was changed:
 Method: FWT>>nSamples:nLevels: (in category 'initialization') 
nSamples: n nLevels: nLevs
"Initialize a wavelet transform."
"Note the sample array size must be N + 5, where N is a multiple of 2^nLevels"
 dyadSize 
(n // (1 bitShift: nLevs)) > 0 ifFalse: [self error: 'Data size error'].
(n \\ (1 bitShift: nLevs)) = 0 ifFalse: [self error: 'Data size error'].
nSamples := n.
+ samples := Float64Array new: n + 5.
 samples := Array new: n + 5.
nLevels := nLevs.
transform := Array new: nLevels*2. "Transformed data is stored as a tree of coeffs"
dyadSize := nSamples.
1 to: nLevels do:
[:i  dyadSize := dyadSize // 2.
+ transform at: 2*i1 put: (Float64Array new: dyadSize + 5).
+ transform at: 2*i put: (Float64Array new: dyadSize + 5)]!
 transform at: 2*i1 put: (Array new: dyadSize + 5).
 transform at: 2*i put: (Array new: dyadSize + 5)]!
Item was changed:
 Method: FWT>>setAlpha:beta: (in category 'initialization') 
setAlpha: alph beta: bet
"Set alpha and beta, compute wavelet coeefs, and derive hFilter and lFilter"
 tcosa tcosb tsina tsinb 
alpha := alph.
beta := bet.
"WaveletCoeffs..."
"precalculate cosine of alpha and sine of beta"
tcosa := alpha cos.
tcosb := beta cos.
tsina := alpha sin.
tsinb := beta sin.
+ coeffs := Float64Array new: 6.
 coeffs := Array new: 6.
"calculate first two wavelet coefficients a := a(2) and b := a(1)"
coeffs at: 1 put: ((1.0 + tcosa + tsina) * (1.0  tcosb  tsinb)
+ (2.0 * tsinb * tcosa)) / 4.0.
coeffs at: 2 put: ((1.0  tcosa + tsina) * (1.0 + tcosb  tsinb)
 (2.0 * tsinb * tcosa)) / 4.0.
"precalculate cosine and sine of alpha minus beta"
tcosa := (alpha  beta) cos.
tsina := (alpha  beta) sin.
"calculate last four wavelet coefficients c := a(0), d := a(1), e := a(2), and f := a(3)"
coeffs at: 3 put: (1.0 + tcosa + tsina) / 2.0.
coeffs at: 4 put: (1.0 + tcosa  tsina) / 2.0.
coeffs at: 5 put: 1.0  (coeffs at: 1)  (coeffs at: 3).
coeffs at: 6 put: 1.0  (coeffs at: 2)  (coeffs at: 4).
"MakeFiltersFromCoeffs..."
"Select the nonzero wavelet coefficients"
coeffs := coeffs copyFrom: (coeffs findFirst: [:c  c abs > 1.0e14])
to: (coeffs findLast: [:c  c abs > 1.0e14]).
"Form the low pass and high pass filters for decomposition"
hTilde := coeffs reversed collect: [:c  c / 2.0].
gTilde := coeffs collect: [:c  c / 2.0].
1 to: gTilde size by: 2 do:
[:i  gTilde at: i put: (gTilde at: i) negated].
"Form the low pass and high pass filters for reconstruction"
h := coeffs copy.
g := coeffs reversed.
2 to: g size by: 2 do:
[:i  g at: i put: (g at: i) negated]
!
More information about the Squeakdev
mailing list
