@@ -136,7 +136,7 @@ julia> push!(audio_schedule, Map(sin, Cycles(660Hz)), 2s, @envelope(
136136 ))
137137
138138julia> audio_schedule
139- 4.0 s^2 44100.0 Hz AudioSchedule
139+ 4.0 s 44100.0 Hz AudioSchedule
140140```
141141
142142You can iterate over an `AudioSchedule`. Each element will just be a vector
@@ -165,17 +165,13 @@ julia> PortAudioStream(0, 1, warn_xruns = false) do stream
165165julia> PortAudioStream(0, 2) do stream
166166 write(stream, audio_schedule)
167167 end
168- ERROR: ArgumentError: PortAudioStream{Float32}
169- Samplerate: 44100.0Hz
170- 2 channel sink: "default" does not have 1 output channel
168+ ERROR: ArgumentError: PortAudioStream does not have 1 output channel
171169[...]
172170
173171julia> PortAudioStream(0, 1, samplerate = 48000) do stream
174172 write(stream, audio_schedule)
175173 end
176- ERROR: ArgumentError: Sample rates of PortAudioStream{Float32}
177- Samplerate: 48000.0Hz
178- 1 channel sink: "default" and 4.0 s^2 44100.0 Hz AudioSchedule do not match
174+ ERROR: ArgumentError: Sample rates of PortAudioStream (48000.0) and AudioSchedule (44100.0) do not match
179175[...]
180176```
181177
@@ -251,14 +247,14 @@ julia> push!(audio_schedule, Map(sin, Cycles(440Hz)), 0s, @envelope(
251247 ))
252248
253249julia> duration(audio_schedule)
254- 2.0 s^2
250+ 2.0 s
255251```
256252"""
257253function duration (audio_schedule:: AudioSchedule )
258254 triggers = audio_schedule. triggers
259255 if length (triggers) > 0
260256 # time from first instrument turned on to last turned off
261- ( last (triggers)[1 ] - first (triggers)[1 ])s
257+ last (triggers)[1 ] - first (triggers)[1 ]
262258 else
263259 # zero for an empty schedule
264260 0.0 s
@@ -320,7 +316,7 @@ For example, `@envelope(0, Line => 1s, 1, Line => 1s, 0)` will create an envelop
320316julia> using AudioSchedules
321317
322318julia> @envelope(0, Line => 1s, 1, Line => 1s, 0)
323- (Line(0.0, 1.0 s^-1 ) => 1.0 s, Line(1.0, -1.0 s^-1 ) => 1.0 s)
319+ (Line(0.0, 1.0 s⁻¹ ) => 1.0 s, Line(1.0, -1.0 s⁻¹ ) => 1.0 s)
324320
325321julia> @envelope(1, 2, 3)
326322ERROR: LoadError: ArgumentError: 2 is not a pair
@@ -419,7 +415,8 @@ function trigger_iterate(
419415 activated = audio_schedule. activated
420416 triggers = audio_schedule. triggers
421417 # pull the rest of the triggers at the current time
422- while schedule_time == trigger_time
418+ # that is, all triggers less than 1 sample away
419+ while trigger_time - schedule_time < 1 / sample_rate
423420 activated[instrument_index] = ! activated[instrument_index]
424421 iteration = iterate (triggers, trigger_state)
425422 if iteration === nothing
@@ -488,10 +485,10 @@ function write(
488485)
489486 sink_messenger = stream. sink_messenger
490487 if nchannels (sink_messenger) != 1
491- throw (ArgumentError (" $stream does not have 1 output channel" ))
488+ throw (ArgumentError (" PortAudioStream does not have 1 output channel" ))
492489 end
493490 if samplerate (stream) != samplerate (audio_schedule)
494- throw (ArgumentError (" Sample rates of $ stream and $ audio_schedule do not match" ))
491+ throw (ArgumentError (" Sample rates of PortAudioStream ( $( samplerate ( stream)) ) and AudioSchedule ( $( samplerate ( audio_schedule)) ) do not match" ))
495492 end
496493 buffer = sink_messenger. buffer
497494 buffer_at = 0
0 commit comments