@@ -199,6 +199,20 @@ fn handle_global_keydown(
199199 }
200200}
201201
202+ // Create a GainNode with an initial value; logs on failure and returns None
203+ fn create_gain ( audio_ctx : & web:: AudioContext , value : f32 , label : & str ) -> Option < web:: GainNode > {
204+ match web:: GainNode :: new ( audio_ctx) {
205+ Ok ( g) => {
206+ g. gain ( ) . set_value ( value) ;
207+ Some ( g)
208+ }
209+ Err ( e) => {
210+ log:: error!( "{} GainNode error: {:?}" , label, e) ;
211+ None
212+ }
213+ }
214+ }
215+
202216// (use overlay::hide instead of local helper)
203217
204218#[ wasm_bindgen( start) ]
@@ -373,24 +387,15 @@ async fn init() -> anyhow::Result<()> {
373387 }
374388
375389 // Master mix bus -> destination
376- let master_gain = match web:: GainNode :: new ( & audio_ctx) {
377- Ok ( g) => g,
378- Err ( e) => {
379- log:: error!( "Master GainNode error: {:?}" , e) ;
380- return ;
381- }
390+ let master_gain = match create_gain ( & audio_ctx, 0.25 , "Master" ) {
391+ Some ( g) => g,
392+ None => return ,
382393 } ;
383- // Start very quiet by default (user can raise with ArrowUp)
384- master_gain. gain ( ) . set_value ( 0.25 ) ;
385394 // Subtle master saturation (arctan) with wet/dry mix
386- let sat_pre = match web:: GainNode :: new ( & audio_ctx) {
387- Ok ( g) => g,
388- Err ( e) => {
389- log:: error!( "sat pre GainNode error: {:?}" , e) ;
390- return ;
391- }
395+ let sat_pre = match create_gain ( & audio_ctx, 0.9 , "sat pre" ) {
396+ Some ( g) => g,
397+ None => return ,
392398 } ;
393- sat_pre. gain ( ) . set_value ( 0.9 ) ;
394399
395400 #[ allow( deprecated) ]
396401 let saturator = match web:: WaveShaperNode :: new ( & audio_ctx) {
@@ -408,23 +413,15 @@ async fn init() -> anyhow::Result<()> {
408413 #[ allow( deprecated) ]
409414 saturator. set_curve ( Some ( curve. as_mut_slice ( ) ) ) ;
410415
411- let sat_wet = match web:: GainNode :: new ( & audio_ctx) {
412- Ok ( g) => g,
413- Err ( e) => {
414- log:: error!( "sat wet GainNode error: {:?}" , e) ;
415- return ;
416- }
416+ let sat_wet = match create_gain ( & audio_ctx, 0.35 , "sat wet" ) {
417+ Some ( g) => g,
418+ None => return ,
417419 } ;
418- sat_wet. gain ( ) . set_value ( 0.35 ) ;
419420
420- let sat_dry = match web:: GainNode :: new ( & audio_ctx) {
421- Ok ( g) => g,
422- Err ( e) => {
423- log:: error!( "sat dry GainNode error: {:?}" , e) ;
424- return ;
425- }
421+ let sat_dry = match create_gain ( & audio_ctx, 0.65 , "sat dry" ) {
422+ Some ( g) => g,
423+ None => return ,
426424 } ;
427- sat_dry. gain ( ) . set_value ( 0.65 ) ;
428425
429426 // Route master -> [dry,dst] and master -> pre -> shaper -> wet -> dst
430427 let _ = master_gain. connect_with_audio_node ( & sat_pre) ;
@@ -436,14 +433,10 @@ async fn init() -> anyhow::Result<()> {
436433
437434 // Global lush reverb (Convolver) and tempo-synced dark delay bus
438435 // Reverb input and wet level
439- let reverb_in = match web:: GainNode :: new ( & audio_ctx) {
440- Ok ( g) => g,
441- Err ( e) => {
442- log:: error!( "Reverb in GainNode error: {:?}" , e) ;
443- return ;
444- }
436+ let reverb_in = match create_gain ( & audio_ctx, 1.0 , "Reverb in" ) {
437+ Some ( g) => g,
438+ None => return ,
445439 } ;
446- reverb_in. gain ( ) . set_value ( 1.0 ) ;
447440 let reverb = match web:: ConvolverNode :: new ( & audio_ctx) {
448441 Ok ( n) => n,
449442 Err ( e) => {
@@ -485,27 +478,19 @@ async fn init() -> anyhow::Result<()> {
485478 reverb. set_buffer ( Some ( & ir) ) ;
486479 }
487480 }
488- let reverb_wet = match web:: GainNode :: new ( & audio_ctx) {
489- Ok ( g) => g,
490- Err ( e) => {
491- log:: error!( "Reverb wet GainNode error: {:?}" , e) ;
492- return ;
493- }
481+ let reverb_wet = match create_gain ( & audio_ctx, 0.6 , "Reverb wet" ) {
482+ Some ( g) => g,
483+ None => return ,
494484 } ;
495- reverb_wet. gain ( ) . set_value ( 0.6 ) ;
496485 let _ = reverb_in. connect_with_audio_node ( & reverb) ;
497486 let _ = reverb. connect_with_audio_node ( & reverb_wet) ;
498487 let _ = reverb_wet. connect_with_audio_node ( & master_gain) ;
499488
500489 // Delay bus with feedback loop and lowpass tone for darkness
501- let delay_in = match web:: GainNode :: new ( & audio_ctx) {
502- Ok ( g) => g,
503- Err ( e) => {
504- log:: error!( "Delay in GainNode error: {:?}" , e) ;
505- return ;
506- }
490+ let delay_in = match create_gain ( & audio_ctx, 1.0 , "Delay in" ) {
491+ Some ( g) => g,
492+ None => return ,
507493 } ;
508- delay_in. gain ( ) . set_value ( 1.0 ) ;
509494 let delay = match audio_ctx. create_delay_with_max_delay_time ( 3.0 ) {
510495 Ok ( n) => n,
511496 Err ( e) => {
@@ -524,22 +509,14 @@ async fn init() -> anyhow::Result<()> {
524509 } ;
525510 delay_tone. set_type ( web:: BiquadFilterType :: Lowpass ) ;
526511 delay_tone. frequency ( ) . set_value ( 1400.0 ) ;
527- let delay_feedback = match web:: GainNode :: new ( & audio_ctx) {
528- Ok ( g) => g,
529- Err ( e) => {
530- log:: error!( "Delay feedback GainNode error: {:?}" , e) ;
531- return ;
532- }
512+ let delay_feedback = match create_gain ( & audio_ctx, 0.6 , "Delay feedback" ) {
513+ Some ( g) => g,
514+ None => return ,
533515 } ;
534- delay_feedback. gain ( ) . set_value ( 0.6 ) ;
535- let delay_wet = match web:: GainNode :: new ( & audio_ctx) {
536- Ok ( g) => g,
537- Err ( e) => {
538- log:: error!( "Delay wet GainNode error: {:?}" , e) ;
539- return ;
540- }
516+ let delay_wet = match create_gain ( & audio_ctx, 0.5 , "Delay wet" ) {
517+ Some ( g) => g,
518+ None => return ,
541519 } ;
542- delay_wet. gain ( ) . set_value ( 0.5 ) ;
543520 let _ = delay_in. connect_with_audio_node ( & delay) ;
544521 let _ = delay. connect_with_audio_node ( & delay_tone) ;
545522 let _ = delay_tone. connect_with_audio_node ( & delay_feedback) ;
@@ -570,15 +547,11 @@ async fn init() -> anyhow::Result<()> {
570547 panner. position_y ( ) . set_value ( pos. y as f32 ) ;
571548 panner. position_z ( ) . set_value ( pos. z as f32 ) ;
572549
573- let gain = match web:: GainNode :: new ( & audio_ctx) {
574- Ok ( g) => g,
575- Err ( e) => {
576- log:: error!( "GainNode error: {:?}" , e) ;
577- return ;
578- }
579- } ;
580550 // Start muted; we will allow toggling via 'M' key
581- gain. gain ( ) . set_value ( 0.0 ) ;
551+ let gain = match create_gain ( & audio_ctx, 0.0 , "Voice gain" ) {
552+ Some ( g) => g,
553+ None => return ,
554+ } ;
582555 if let Err ( e) = gain. connect_with_audio_node ( & panner) {
583556 log:: error!( "connect error: {:?}" , e) ;
584557 return ;
@@ -588,24 +561,16 @@ async fn init() -> anyhow::Result<()> {
588561 return ;
589562 }
590563 // Per-voice sends
591- let d_send = match web:: GainNode :: new ( & audio_ctx) {
592- Ok ( g) => g,
593- Err ( e) => {
594- log:: error!( "Delay send GainNode error: {:?}" , e) ;
595- return ;
596- }
564+ let d_send = match create_gain ( & audio_ctx, 0.4 , "Delay send" ) {
565+ Some ( g) => g,
566+ None => return ,
597567 } ;
598- d_send. gain ( ) . set_value ( 0.4 ) ;
599568 let _ = d_send. connect_with_audio_node ( & delay_in) ;
600569 delay_sends_vec. push ( d_send) ;
601- let r_send = match web:: GainNode :: new ( & audio_ctx) {
602- Ok ( g) => g,
603- Err ( e) => {
604- log:: error!( "Reverb send GainNode error: {:?}" , e) ;
605- return ;
606- }
570+ let r_send = match create_gain ( & audio_ctx, 0.65 , "Reverb send" ) {
571+ Some ( g) => g,
572+ None => return ,
607573 } ;
608- r_send. gain ( ) . set_value ( 0.65 ) ;
609574 let _ = r_send. connect_with_audio_node ( & reverb_in) ;
610575 reverb_sends_vec. push ( r_send) ;
611576 voice_gains. push ( gain) ;
0 commit comments