@@ -133,18 +133,23 @@ function save(audioBuffer: AudioBuffer) {
133133}
134134
135135/**
136- * Throws an error if any of the provided parameters are outside of their
137- * acceptable values.
136+ * Throws an exception if duration is not a number or if
137+ * number is negative
138138 */
139- function validateSound ( func_name : string , wave : Wave , duration : number ) {
139+ function validateDuration ( func_name : string , duration : unknown ) : asserts duration is number {
140140 if ( typeof duration !== 'number' ) {
141141 throw new Error ( `${ func_name } expects a number for duration, got ${ duration } ` ) ;
142142 }
143143
144144 if ( duration < 0 ) {
145145 throw new Error ( `${ func_name } : Sound duration must be greater than or equal to 0` ) ;
146146 }
147+ }
147148
149+ /**
150+ * Throws an exception if wave is not a function
151+ */
152+ function validateWave ( func_name : string , wave : unknown ) : asserts wave is Wave {
148153 if ( typeof wave !== 'function' ) {
149154 throw new Error ( `${ func_name } expects a wave, got ${ wave } ` ) ;
150155 }
@@ -266,7 +271,9 @@ export function record_for(duration: number, buffer: number): () => Sound {
266271 * @example const s = make_sound(t => Math_sin(2 * Math_PI * 440 * t), 5);
267272 */
268273export function make_sound ( wave : Wave , duration : number ) : Sound {
269- validateSound ( make_sound . name , wave , duration ) ;
274+ validateDuration ( make_sound . name , duration ) ;
275+ validateWave ( make_sound . name , wave ) ;
276+
270277 return pair ( ( t : number ) => ( t >= duration ? 0 : wave ( t ) ) , duration ) ;
271278}
272279
@@ -316,7 +323,9 @@ export function is_sound(x: unknown): x is Sound {
316323 * @example play_wave(t => math_sin(t * 3000), 5);
317324 */
318325export function play_wave ( wave : Wave , duration : number ) : Sound {
319- validateSound ( play_wave . name , wave , duration ) ;
326+ validateDuration ( play_wave . name , duration ) ;
327+ validateWave ( play_wave . name , wave ) ;
328+
320329 return play ( make_sound ( wave , duration ) ) ;
321330}
322331
@@ -486,6 +495,7 @@ export function stop(): void {
486495 * @category Primitive
487496 */
488497export function noise_sound ( duration : number ) : Sound {
498+ validateDuration ( noise_sound . name , duration ) ;
489499 return make_sound ( ( _t ) => Math . random ( ) * 2 - 1 , duration ) ;
490500}
491501
@@ -498,6 +508,7 @@ export function noise_sound(duration: number): Sound {
498508 * @category Primitive
499509 */
500510export function silence_sound ( duration : number ) : Sound {
511+ validateDuration ( silence_sound . name , duration ) ;
501512 return make_sound ( ( _t ) => 0 , duration ) ;
502513}
503514
@@ -511,6 +522,7 @@ export function silence_sound(duration: number): Sound {
511522 * @category Primitive
512523 */
513524export function sine_sound ( freq : number , duration : number ) : Sound {
525+ validateDuration ( sine_sound . name , duration ) ;
514526 return make_sound ( ( t ) => Math . sin ( 2 * Math . PI * t * freq ) , duration ) ;
515527}
516528
@@ -524,6 +536,7 @@ export function sine_sound(freq: number, duration: number): Sound {
524536 * @category Primitive
525537 */
526538export function square_sound ( f : number , duration : number ) : Sound {
539+ validateDuration ( square_sound . name , duration ) ;
527540 function fourier_expansion_square ( t : number ) {
528541 let answer = 0 ;
529542 for ( let i = 1 ; i <= fourier_expansion_level ; i += 1 ) {
@@ -547,6 +560,7 @@ export function square_sound(f: number, duration: number): Sound {
547560 * @category Primitive
548561 */
549562export function triangle_sound ( freq : number , duration : number ) : Sound {
563+ validateDuration ( triangle_sound . name , duration ) ;
550564 function fourier_expansion_triangle ( t : number ) {
551565 let answer = 0 ;
552566 for ( let i = 0 ; i < fourier_expansion_level ; i += 1 ) {
@@ -572,6 +586,7 @@ export function triangle_sound(freq: number, duration: number): Sound {
572586 * @category Primitive
573587 */
574588export function sawtooth_sound ( freq : number , duration : number ) : Sound {
589+ validateDuration ( sawtooth_sound . name , duration ) ;
575590 function fourier_expansion_sawtooth ( t : number ) {
576591 let answer = 0 ;
577592 for ( let i = 1 ; i <= fourier_expansion_level ; i += 1 ) {
@@ -673,7 +688,7 @@ export function adsr(
673688 sustain_level : number ,
674689 release_ratio : number
675690) : SoundTransformer {
676- return ( sound ) => {
691+ return sound => {
677692 const wave = get_wave ( sound ) ;
678693 const duration = get_duration ( sound ) ;
679694 const attack_time = duration * attack_ratio ;
0 commit comments