[squeak-dev] The Trunk: Sound-pre.65.mcz

marcel.taeumel Marcel.Taeumel at hpi.de
Mon Dec 10 12:37:59 UTC 2018


Wohoo! Keep going! :-)


commits-2 wrote
> Patrick Rein uploaded a new version of Sound to project The Trunk:
> http://source.squeak.org/trunk/Sound-pre.65.mcz
> 
> ==================== Summary ====================
> 
> Name: Sound-pre.65
> Author: pre
> Time: 7 December 2018, 4:27:31.425037 pm
> UUID: ed53607e-fbea-4ed9-bc9e-9bad91b11372
> Ancestors: Sound-pre.64
> 
> Categorizes uncategorized messages in the Sound package (1250 methods to
> go).
> 
> =============== Diff against Sound-pre.64 ===============
> 
> Item was changed:
> + ----- Method: AmbientEvent>>morph (in category 'accessing') -----
> - ----- Method: AmbientEvent>>morph (in category 'as yet unclassified')
> -----
>   morph 
>   	^ morph!
> 
> Item was changed:
> + ----- Method: AmbientEvent>>morph: (in category 'accessing') -----
> - ----- Method: AmbientEvent>>morph: (in category 'as yet unclassified')
> -----
>   morph: m
>   	morph := m!
> 
> Item was changed:
> + ----- Method:
> AmbientEvent>>occurAtTime:inScorePlayer:atIndex:inEventTrack:secsPerTick:
> (in category 'sound generation') -----
> - ----- Method:
> AmbientEvent>>occurAtTime:inScorePlayer:atIndex:inEventTrack:secsPerTick:
> (in category 'as yet unclassified') -----
>   occurAtTime: ticks inScorePlayer: player atIndex: index inEventTrack:
> track secsPerTick: secsPerTick
>   	(target == nil or: [selector == nil]) ifTrue:
>   		[morph ifNil: [^ self].
>   		^ morph encounteredAtTime: ticks inScorePlayer: player atIndex: index
>   				inEventTrack: track secsPerTick: secsPerTick].
>   	target perform: selector withArguments: arguments!
> 
> Item was changed:
> + ----- Method: AmbientEvent>>target:selector:arguments: (in category
> 'accessing') -----
> - ----- Method: AmbientEvent>>target:selector:arguments: (in category 'as
> yet unclassified') -----
>   target: t selector: s arguments: a
>   	target := t.
>   	selector := s.
>   	arguments := a.
>   !
> 
> Item was changed:
> + ----- Method: CompressedSoundData>>compressWith: (in category
> 'compressing') -----
> - ----- Method: CompressedSoundData>>compressWith: (in category 'as yet
> unclassified') -----
>   compressWith: codecClass
>   
>   	codecName == codecClass name asSymbol ifTrue: [^self].
>   	^self asSound compressWith: codecClass!
> 
> Item was changed:
> + ----- Method: CompressedSoundData>>compressWith:atRate: (in category
> 'compressing') -----
> - ----- Method: CompressedSoundData>>compressWith:atRate: (in category 'as
> yet unclassified') -----
>   compressWith: codecClass atRate: aSamplingRate
>   
>   	(codecName == codecClass name asSymbol and: [samplingRate =
> aSamplingRate]) ifTrue: [^self].
>   	^self asSound compressWith: codecClass atRate: aSamplingRate!
> 
> Item was changed:
> + ----- Method: CompressedSoundData>>withEToySound:samplingRate: (in
> category 'initialize-release') -----
> - ----- Method: CompressedSoundData>>withEToySound:samplingRate: (in
> category 'as yet unclassified') -----
>   withEToySound: aByteArray samplingRate: anInteger
>   
>   	soundClassName := #SampledSound.
>   	channels := {aByteArray}.
>   	codecName := #GSMCodec.
>   	loopEnd := nil.	"???"
>   	loopLength :=  nil.
>   	perceivedPitch := 100.0.
>   	samplingRate  := anInteger.
>   	gain  := 1.0.	"???"
>   	firstSample := 1.
>   	cachedSound  := nil.	"???"!
> 
> Item was changed:
> + ----- Method: FMBassoonSound>>setPitch:dur:loudness: (in category
> 'initialization') -----
> - ----- Method: FMBassoonSound>>setPitch:dur:loudness: (in category 'as
> yet unclassified') -----
>   setPitch: pitchNameOrNumber dur: d loudness: l
>   	"Select a modulation ratio and modulation envelope scale based on my
> pitch."
>   
>   	| p modScale |
>   	p := self nameOrNumberToPitch: pitchNameOrNumber.
>   	modScale := 9.4.
>   	p > 100.0 ifTrue: [modScale := 8.3].
>   	p > 150.0 ifTrue: [modScale := 6.4].
>   	p > 200.0 ifTrue: [modScale := 5.2].
>   	p > 300.0 ifTrue: [modScale := 3.9].
>   	p > 400.0 ifTrue: [modScale := 2.8].
>   	p > 600.0 ifTrue: [modScale := 1.7].
>   
>   	envelopes size > 0 ifTrue: [
>   		envelopes do: [:e |
>   			(e updateSelector = #modulation:)
>   				ifTrue: [e scale: modScale]]].
>   
>   	super setPitch: p dur: d loudness: l.
>   !
> 
> Item was changed:
> + ----- Method: MIDIFileReader class>>scoreFromFileNamed: (in category
> 'reading') -----
> - ----- Method: MIDIFileReader class>>scoreFromFileNamed: (in category 'as
> yet unclassified') -----
>   scoreFromFileNamed: fileName
>   
>   	| f score |
>   	f := (FileStream readOnlyFileNamed: fileName) binary.
>   	score := (self new readMIDIFrom: f) asScore.
>   	f close.
>   	^ score
>   !
> 
> Item was changed:
> + ----- Method: MIDIFileReader class>>scoreFromStream: (in category
> 'reading') -----
> - ----- Method: MIDIFileReader class>>scoreFromStream: (in category 'as
> yet unclassified') -----
>   scoreFromStream: binaryStream
>   
>   	|  score |
>   	score := (self new readMIDIFrom: binaryStream) asScore.
>   	^ score
>   !
> 
> Item was changed:
> + ----- Method: MIDIFileReader class>>scoreFromURL: (in category
> 'reading') -----
> - ----- Method: MIDIFileReader class>>scoreFromURL: (in category 'as yet
> unclassified') -----
>   scoreFromURL: urlString
>   
>   	| data |
>   	data := HTTPSocket httpGet: urlString accept: 'audio/midi'.
>   	data binary.
>   	^ (self new readMIDIFrom: data) asScore.
>   !
> 
> Item was changed:
> + ----- Method: MIDIFileReader class>>standardMIDIInstrumentNames (in
> category 'instruments') -----
> - ----- Method: MIDIFileReader class>>standardMIDIInstrumentNames (in
> category 'as yet unclassified') -----
>   standardMIDIInstrumentNames
>   	"Answer an array of Standard MIDI instrument names."
>   
>   	^ #(
>   		'Grand Piano'
>   		'Bright Piano'
>   		'Electric Grand Piano'
>   		'Honky-tonk Piano'
>   		'Electric Piano 1'
>   		'Electric Piano 2'
>   		'Harpsichord'
>   		'Clavichord'
>   		'Celesta'
>   		'Glockenspiel'
>   		'Music Box'
>   		'Vibraphone'
>   		'Marimba'
>   		'Xylophone'
>   		'Tubular Bells'
>   		'Duclimer'
>   		'Drawbar Organ'
>   		'Percussive Organ'
>   		'Rock Organ'
>   		'Church Organ'
>   		'Reed Organ'
>   		'Accordion'
>   		'Harmonica'
>   		'Tango Accordion'
>   		'Nylon Guitar'
>   		'Steel Guitar'
>   		'Electric Guitar 1'
>   		'Electric Guitar 2'
>   		'Electric Guitar 3'
>   		'Overdrive Guitar'
>   		'Distorted Guitar'
>   		'Guitar Harmonics'
>   		'Acoustic Bass'
>   		'Electric Bass 1'
>   		'Electric Bass 2'
>   		'Fretless Bass'
>   		'Slap Bass 1'
>   		'Slap Bass 2'
>   		'Synth Bass 1'
>   		'Synth Bass 2'
>   		'Violin'
>   		'Viola'
>   		'Cello'
>   		'Contrabass'
>   		'Tremolo Strings'
>   		'Pizzicato Strings'
>   		'Orchestral Harp'
>   		'Timpani'
>   		'String Ensemble 1'
>   		'String Ensemble 2'
>   		'Synth Strings 1'
>   		'Synth Strings 2'
>   		'Choir Ahhs'
>   		'Choir Oohs'
>   		'Synth Voice'
>   		'Orchestra Hit'
>   		'Trumpet'
>   		'Trombone'
>   		'Tuba'
>   		'Muted Trumpet'
>   		'French Horn'
>   		'Brass Section'
>   		'Synth Brass 1'
>   		'Synth Brass 2'
>   		'Soprano Sax'
>   		'Alto Sax'
>   		'Tenor Sax'
>   		'Baritone Sax'
>   		'Oboe'
>   		'English Horn'
>   		'Bassoon'
>   		'Clarinet'
>   		'Piccolo'
>   		'Flute'
>   		'Recorder'
>   		'Pan Flute'
>   		'Blown Bottle'
>   		'Shakuhachi'
>   		'Whistle'
>   		'Ocarina'
>   		'Lead 1 (square)'
>   		'Lead 2 (sawtooth)'
>   		'Lead 3 (calliope)'
>   		'Lead 4 (chiff)'
>   		'Lead 5 (charang)'
>   		'Lead 6 (voice)'
>   		'Lead 7 (fifths)'
>   		'Lead 8 (bass+lead)'
>   		'Pad 1 (new age)'
>   		'Pad 2 (warm)'
>   		'Pad 3 (polysynth)'
>   		'Pad 4 (choir)'
>   		'Pad 5 (bowed)'
>   		'Pad 6 (metallic)'
>   		'Pad 7 (halo)'
>   		'Pad 8 (sweep)'
>   		'FX 1 (rain)'
>   		'FX 2 (soundtrack)'
>   		'FX 3 (crystals)'
>   		'FX 4 (atmosphere)'
>   		'FX 5 (brightness)'
>   		'FX 6 (goblins)'
>   		'FX 7 (echoes)'
>   		'FX 8 (sci-fi)'
>   		'Sitar'
>   		'Banjo'
>   		'Shamisen'
>   		'Koto'
>   		'Kalimba'
>   		'Bagpipe'
>   		'Fiddle'
>   		'Shanai'
>   		'Tinkle Bell'
>   		'Agogo'
>   		'Steel Drum'
>   		'Woodblock'
>   		'Taiko Drum'
>   		'Melodic Tom'
>   		'Synth Drum'
>   		'Reverse Cymbal'
>   		'Guitar Fret Noise'
>   		'Breath Noise'
>   		'Seashore'
>   		'Bird Tweet'
>   		'Telephone Ring'
>   		'Helicopter'
>   		'Applause'
>   		'Gunshot')
>   !
> 
> Item was changed:
> + ----- Method: MIDISound>>play (in category 'playing') -----
> - ----- Method: MIDISound>>play (in category 'as yet unclassified') -----
>   play
>   	"The base class ScorePlayer has two interfaces: a sound and a sound
> player. Choose the right interface depending on whether MIDI support is
> present."
>   	
>   	SoundService soundEnabled ifFalse: [^ self].
>   	
>   	SimpleMIDIPort useMIDIDeviceForOutput ifTrue: [
>   		[self openMIDIPort]
>   			on: Error
>   			do: [
>   				SimpleMIDIPort askForDefault.
>   				[self openMIDIPort]
>   					on: Error
>   					do: [
>   						self inform: 'Use of MIDI device is not working. Using custom
> synthesis.\Go to preferences to change again.' withCRs.
>   						SimpleMIDIPort useMIDIDeviceForOutput: false]]].
>   
>   	self reset; resumePlaying.!
> 
> Item was changed:
> + ----- Method: MIDISynth>>channel: (in category 'channels') -----
> - ----- Method: MIDISynth>>channel: (in category 'as yet unclassified')
> -----
>   channel: i
>   
>   	^ channels at: i
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>closeMIDIPort (in category 'midi port') -----
> - ----- Method: MIDISynth>>closeMIDIPort (in category 'as yet
> unclassified') -----
>   closeMIDIPort
>   
>   	midiParser midiPort ifNil: [^ self].
>   	midiParser midiPort close.
>   	midiParser midiPort: nil.
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>initialize (in category 'initialize-release')
> -----
> - ----- Method: MIDISynth>>initialize (in category 'as yet unclassified')
> -----
>   initialize
>   
>   	super initialize.
>   	midiParser := MIDIInputParser on: nil.
>   	channels := (1 to: 16) collect: [:ch | MIDISynthChannel new
> initialize].
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>instrumentForChannel: (in category 'channels')
> -----
> - ----- Method: MIDISynth>>instrumentForChannel: (in category 'as yet
> unclassified') -----
>   instrumentForChannel: channelIndex
>   
>   	^ (channels at: channelIndex) instrument
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>instrumentForChannel:put: (in category
> 'channels') -----
> - ----- Method: MIDISynth>>instrumentForChannel:put: (in category 'as yet
> unclassified') -----
>   instrumentForChannel: channelIndex put: aSoundProto
>   
>   	(channels at: channelIndex) instrument: aSoundProto.
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>isOn (in category 'testing') -----
> - ----- Method: MIDISynth>>isOn (in category 'as yet unclassified') -----
>   isOn
>   
>   	^ process notNil
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>midiParser (in category 'accessing') -----
> - ----- Method: MIDISynth>>midiParser (in category 'as yet unclassified')
> -----
>   midiParser
>   
>   	^ midiParser
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>midiPort (in category 'midi port') -----
> - ----- Method: MIDISynth>>midiPort (in category 'as yet unclassified')
> -----
>   midiPort
>   
>   	^ midiParser midiPort
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>midiPort: (in category 'midi port') -----
> - ----- Method: MIDISynth>>midiPort: (in category 'as yet unclassified')
> -----
>   midiPort: aMIDIPortOrNil
>   
>   	midiParser midiPort: aMIDIPortOrNil.
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>midiTrackingLoop (in category 'tracking') -----
> - ----- Method: MIDISynth>>midiTrackingLoop (in category 'as yet
> unclassified') -----
>   midiTrackingLoop
>   
>   	midiParser clearBuffers.
>   	
>   	[self processMIDI ifFalse: [(Delay forMilliseconds: 5) wait]] repeat!
> 
> Item was changed:
> + ----- Method: MIDISynth>>mutedForChannel:put: (in category 'channels')
> -----
> - ----- Method: MIDISynth>>mutedForChannel:put: (in category 'as yet
> unclassified') -----
>   mutedForChannel: channelIndex put: aBoolean
>   
>   	^ (channels at: channelIndex) muted: aBoolean
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>panForChannel: (in category 'channels') -----
> - ----- Method: MIDISynth>>panForChannel: (in category 'as yet
> unclassified') -----
>   panForChannel: channelIndex
>   
>   	^ (channels at: channelIndex) pan
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>panForChannel:put: (in category 'channels')
> -----
> - ----- Method: MIDISynth>>panForChannel:put: (in category 'as yet
> unclassified') -----
>   panForChannel: channelIndex put: newPan
>   
>   	(channels at: channelIndex) pan: newPan.
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>processMIDI (in category 'private-tracking')
> -----
> - ----- Method: MIDISynth>>processMIDI (in category 'as yet unclassified')
> -----
>   processMIDI
>   	"Process some MIDI commands. Answer true if any commands were
> processed."
>   
>   	| didSomething |
>   	didSomething := false.
>   	midiParser midiDo: [:item | | cmdByte byte1 chan cmd byte2 |
>   		didSomething := true.
>   		cmdByte := item at: 2.
>   		byte1 := byte2 := nil.
>   		item size > 2 ifTrue: [
>   			byte1 := item at: 3.
>   			item size > 3 ifTrue: [byte2 := item at: 4]].
>   		cmdByte < 240
>   			ifTrue: [  "channel message" 
>   				cmd := cmdByte bitAnd: 2r11110000.
>   				chan := (cmdByte bitAnd: 2r00001111) + 1.
>   				(channels at: chan) doChannelCmd: cmd byte1: byte1 byte2: byte2]
>   			ifFalse: [  "system message"
>   				"process system messages here"
>   			]].
>   	^ didSomething
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>processMIDIUntilMouseDown (in category
> 'private-tracking') -----
> - ----- Method: MIDISynth>>processMIDIUntilMouseDown (in category 'as yet
> unclassified') -----
>   processMIDIUntilMouseDown
>   	"Used for debugging. Do MIDI processing until the mouse is pressed."
>   
>   	midiParser clearBuffers.
>   	[Sensor anyButtonPressed] whileFalse: [self processMIDI].
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>setAllChannelMasterVolumes: (in category
> 'channels') -----
> - ----- Method: MIDISynth>>setAllChannelMasterVolumes: (in category 'as
> yet unclassified') -----
>   setAllChannelMasterVolumes: aNumber
>   
>   	| vol |
>   	vol := (aNumber asFloat min: 1.0) max: 0.0.
>   	channels do: [:ch | ch masterVolume: vol].
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>startMIDITracking (in category 'tracking')
> -----
> - ----- Method: MIDISynth>>startMIDITracking (in category 'as yet
> unclassified') -----
>   startMIDITracking
>   
>   	midiParser ifNil: [^ self].
>   	midiParser midiPort ifNil: [^ self].
>   	midiParser midiPort ensureOpen.
>   	self stopMIDITracking.
>   	SoundPlayer useShortBuffer.
>   	process := [self midiTrackingLoop] newProcess.
>   	process priority: Processor userInterruptPriority.
>   	process resume.
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>stopMIDITracking (in category 'tracking') -----
> - ----- Method: MIDISynth>>stopMIDITracking (in category 'as yet
> unclassified') -----
>   stopMIDITracking
>   
>   	process ifNotNil: [
>   		process terminate.
>   		process := nil].
>   	SoundPlayer shutDown: true; initialize.  "revert to normal buffer size"
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>volumeForChannel: (in category 'channels')
> -----
> - ----- Method: MIDISynth>>volumeForChannel: (in category 'as yet
> unclassified') -----
>   volumeForChannel: channelIndex
>   
>   	^  (channels at: channelIndex) masterVolume
>   !
> 
> Item was changed:
> + ----- Method: MIDISynth>>volumeForChannel:put: (in category 'channels')
> -----
> - ----- Method: MIDISynth>>volumeForChannel:put: (in category 'as yet
> unclassified') -----
>   volumeForChannel: channelIndex put: newVolume
>   
>   	(channels at: channelIndex) masterVolume: newVolume.
>   !
> 
> Item was changed:
> + ----- Method: PitchEnvelope>>centerPitch (in category 'accessing') -----
> - ----- Method: PitchEnvelope>>centerPitch (in category 'as yet
> unclassified') -----
>   centerPitch
>   
>   	^ centerPitch
>   !
> 
> Item was changed:
> + ----- Method: PitchEnvelope>>centerPitch: (in category 'accessing')
> -----
> - ----- Method: PitchEnvelope>>centerPitch: (in category 'as yet
> unclassified') -----
>   centerPitch: aNumber
>   
>   	centerPitch := aNumber.
>   !
> 
> Item was changed:
> + ----- Method: PitchEnvelope>>updateSelector (in category 'accessing')
> -----
> - ----- Method: PitchEnvelope>>updateSelector (in category 'as yet
> unclassified') -----
>   updateSelector
>   	"Needed by the envelope editor."
>   
>   	^ #pitch:
>   !
> 
> Item was changed:
> + ----- Method: PitchEnvelope>>updateTargetAt: (in category 'applying')
> -----
> - ----- Method: PitchEnvelope>>updateTargetAt: (in category 'as yet
> unclassified') -----
>   updateTargetAt: mSecs
>   	"Update the pitch for my target. Answer true if the value changed."
>   	"Details: Assume envelope range is 0.0..2.0, with 1 being the center
> pitch. Subtracting one yields the range -1.0..1.0. Raising two to this
> power yields pitches between half and double the center pitch; i.e. from
> an octave below to an octave about the center pitch."
>   
>   	| newValue |
>   	newValue := self valueAtMSecs: mSecs.
>   	newValue ~= lastValue ifTrue: [
>   		target pitch: (2.0 raisedTo: newValue - (scale / 2.0)) * centerPitch.
>   		lastValue := newValue.
>   		^ true].
>   
>   	^ false
>   !
> 
> Item was changed:
>   ----- Method: SampledSound class>>useCoffeeCupClink (in category
> 'default sound') -----
>   useCoffeeCupClink
>   	"Set the sample table to be used as the default waveform to the sound
> of a coffee cup being tapped with a spoon."
>   	"SampledSound useCoffeeCupClink bachFugue play"
>   
>   	DefaultSampleTable := self coffeeCupClink.
>   	NominalSamplePitch := 400.
>   !
> 
> Item was changed:
> + ----- Method: SoundBuffer>>writeOnGZIPByteStream: (in category 'objects
> from disk') -----
> - ----- Method: SoundBuffer>>writeOnGZIPByteStream: (in category 'as yet
> unclassified') -----
>   writeOnGZIPByteStream: aStream 
>   	
>   	aStream nextPutAllWordArray: self!
> 
> Item was changed:
> + ----- Method: SoundPlayer>>startUp (in category 'system startup') -----
> - ----- Method: SoundPlayer>>startUp (in category 'as yet unclassified')
> -----
>   startUp
>   	Preferences automaticPlatformSettings ifFalse: [^ self].
>   
>   	SoundPlayer soundQuickStart: SoundPlayer defaultQuickStartForPlatform.
>   	SoundPlayer stopSoundWhenDone: SoundPlayer
> defaultStopSoundForPlatform.!
> 
> Item was changed:
> + ----- Method: TempoEvent>>isTempoEvent (in category 'classification')
> -----
> - ----- Method: TempoEvent>>isTempoEvent (in category 'as yet
> unclassified') -----
>   isTempoEvent
>   
>   	^ true
>   !
> 
> Item was changed:
> + ----- Method: TempoEvent>>printOn: (in category 'printing') -----
> - ----- Method: TempoEvent>>printOn: (in category 'as yet unclassified')
> -----
>   printOn: aStream
>   
>   	aStream nextPut: $(.
>   	time printOn: aStream.
>   	aStream nextPutAll: ': tempo '.
>   	aStream nextPutAll:  (120.0 * (500000.0 / tempo)
> printShowingMaxDecimalPlaces: 2).
>   	aStream nextPut: $).
>   !
> 
> Item was changed:
> + ----- Method: TempoEvent>>tempo (in category 'accessing') -----
> - ----- Method: TempoEvent>>tempo (in category 'as yet unclassified')
> -----
>   tempo
>   
>   	^ tempo
>   !
> 
> Item was changed:
> + ----- Method: TempoEvent>>tempo: (in category 'accessing') -----
> - ----- Method: TempoEvent>>tempo: (in category 'as yet unclassified')
> -----
>   tempo: anInteger
>   
>   	tempo := anInteger.
>   !
> 
> Item was changed:
> + ----- Method: UnloadedSound class>>default (in category 'instruments')
> -----
> - ----- Method: UnloadedSound class>>default (in category 'as yet
> unclassified') -----
>   default
>   	"UnloadedSound default play"
>   
>   	| snd p |
>   	snd := super new modulation: 1 ratio: 1.
>   	p := OrderedCollection new.
>   	p add: 0 at 0.0; add: 10 at 1.0; add: 100 at 1.0; add: 120 at 0.0.
>   	snd addEnvelope: (VolumeEnvelope points: p loopStart: 2 loopEnd: 3).
>   	^ snd setPitch: 440.0 dur: 1.0 loudness: 0.5
>   !
> 
> Item was changed:
> + ----- Method: VolumeEnvelope>>computeSlopeAtMSecs: (in category
> 'private') -----
> - ----- Method: VolumeEnvelope>>computeSlopeAtMSecs: (in category 'as yet
> unclassified') -----
>   computeSlopeAtMSecs: mSecs
>   	"Private!! Find the next inflection point of this envelope and compute
> its target volume and the number of milliseconds until the inflection
> point is reached."
>   
>   	| t i |
>   	((loopEndMSecs ~~ nil) and: [mSecs >= loopEndMSecs]) ifTrue: [  "decay
> phase"
>   		t := (points at: loopEndIndex) x + (mSecs - loopEndMSecs).
>   		i := self indexOfPointAfterMSecs: t startingAt: loopEndIndex.
>   		i == nil ifTrue: [  "past end"
>   			targetVol := points last y * decayScale.
>   			mSecsForChange := 0.
>   			nextRecomputeTime := mSecs + 1000000.
>   			^ self].
>   		targetVol := (points at: i) y * decayScale.
>   		mSecsForChange := (((points at: i) x - t) min: (endMSecs - mSecs))
> max: 4.
>   		nextRecomputeTime := mSecs + mSecsForChange.
>   		^ self].
>   
>   	mSecs < loopStartMSecs ifTrue: [  "attack phase"
>   		i := self indexOfPointAfterMSecs: mSecs startingAt: 1.
>   		targetVol := (points at: i) y.
>   		mSecsForChange := ((points at: i) x - mSecs) max: 4.
>   		nextRecomputeTime := mSecs + mSecsForChange.
>   		((loopEndMSecs ~~ nil) and: [nextRecomputeTime > loopEndMSecs])
>   			ifTrue: [nextRecomputeTime := loopEndMSecs].
>   		^ self].
>   
>   	"sustain and loop phase"
>   	noChangesDuringLoop ifTrue: [
>   		targetVol := (points at: loopEndIndex) y.
>   		mSecsForChange := 10.
>   		loopEndMSecs == nil
>   			ifTrue: [nextRecomputeTime := mSecs + 10]  "unknown end time"
>   			ifFalse: [nextRecomputeTime := loopEndMSecs].
>   		^ self].
>   
>   	loopMSecs = 0 ifTrue: [^ (points at: loopEndIndex) y].  "looping on a
> single point"
>   	t := loopStartMSecs + ((mSecs - loopStartMSecs) \\ loopMSecs).
>   	i := self indexOfPointAfterMSecs: t startingAt: loopStartIndex.
>   	targetVol := (points at: i) y.
>   	mSecsForChange := ((points at: i) x - t) max: 4.
>   	nextRecomputeTime := (mSecs + mSecsForChange) min: loopEndMSecs.
>   !
> 
> Item was changed:
> + ----- Method: VolumeEnvelope>>reset (in category 'applying') -----
> - ----- Method: VolumeEnvelope>>reset (in category 'as yet unclassified')
> -----
>   reset
>   	"Reset the state for this envelope."
>   
>   	super reset.
>   	target initialVolume: points first y * scale.
>   	nextRecomputeTime := 0.
>   !
> 
> Item was changed:
> + ----- Method: VolumeEnvelope>>updateSelector (in category 'accessing')
> -----
> - ----- Method: VolumeEnvelope>>updateSelector (in category 'as yet
> unclassified') -----
>   updateSelector
>   	"Needed by the envelope editor."
>   
>   	^ #volume:
>   !
> 
> Item was changed:
> + ----- Method: VolumeEnvelope>>updateTargetAt: (in category 'applying')
> -----
> - ----- Method: VolumeEnvelope>>updateTargetAt: (in category 'as yet
> unclassified') -----
>   updateTargetAt: mSecs
>   	"Update the volume envelope slope and limit for my target. Answer
> false."
>   
>   	mSecs < nextRecomputeTime ifTrue: [^ false].
>   	self computeSlopeAtMSecs: mSecs.
>   	mSecsForChange < 5 ifTrue: [mSecsForChange := 5].  "don't change
> instantly to avoid clicks"
>   	target adjustVolumeTo: targetVol * scale overMSecs: mSecsForChange.
>   	^ false
>   !
> 
> Item was changed:
> + ----- Method: VolumeEnvelope>>volume: (in category 'accessing') -----
> - ----- Method: VolumeEnvelope>>volume: (in category 'as yet
> unclassified') -----
>   volume: aNumber
>   	"Set the maximum volume of a volume-controlling envelope."
>   
>   	scale := aNumber asFloat.
>   !





--
Sent from: http://forum.world.st/Squeak-Dev-f45488.html


More information about the Squeak-dev mailing list