Fork Heaps on GitHub
Menu

Example Sound

«    »

Heaps supports sound on all platforms

import hxd.snd.NativeChannel;

class NoiseChannel extends hxd.snd.NativeChannel {

  public function new() {
    super(4096);
  }

  override function onSample( buf : haxe.io.Float32Array ) {
    for( i in 0...buf.length )
      buf[i] = Math.random() * 2 - 1;
  }

}


class Sound extends SampleApp {

  var time = 0.;
  var slider : h2d.Slider;
  var music : hxd.snd.Channel;
  var musicPosition : h2d.Text;
  var beeper:Bool = true;
  var pitchFilter : hxd.snd.effect.Pitch;
  var pitchShift:Bool = false;
  var pitchSlider : h2d.Slider;

  override function init() {
    super.init();

    var res = if( hxd.res.Sound.supportedFormat(Mp3) || hxd.res.Sound.supportedFormat(OggVorbis) ) hxd.Res.music_loop else null;
    pitchFilter = new hxd.snd.effect.Pitch();
    var lowpass = new hxd.snd.effect.LowPass();
    var spatial = new hxd.snd.effect.Spatialization();
    if( res != null ) {
      trace("Playing "+res);
      music = res.play(true);
      //music.queueSound(...);
      music.onEnd = function() trace("LOOP");
      // Use effect processing on the channel
      music.addEffect(pitchFilter);
      music.addEffect(lowpass);
      music.addEffect(spatial);
    }

    slider = new h2d.Slider(300, 10);
    slider.onChange = function() {
      music.position = slider.value * music.duration;
    };
    musicPosition = new h2d.Text(getFont());

    // slider.x = 150;
    // slider.y = 80;
    // if( music == null ) slider.remove();
    // slider.onChange = function() {
    //   music.position = slider.value * music.duration;
    // };
    // musicPosition.setPosition(460, 80);

    addSlider("Global vol", function() { return hxd.snd.Manager.get().masterVolume; }, function(v) { hxd.snd.Manager.get().masterVolume = v; });
    addCheck("Beeper", function() { return beeper; }, function(v) { beeper = v; });
    addButton("Play noise", function() {
      var c = new NoiseChannel();
      haxe.Timer.delay(c.stop, 1000);
    });
    if ( music != null ) {
      addCheck("Music mute", function() { return music.mute; }, function(v) { music.mute = v; });
      addSlider("Music vol", function() { return music.volume; }, function(v) { music.volume = v; });
      var f = new h2d.Flow(fui);
      f.horizontalSpacing = 5;
      var tf = new h2d.Text(getFont(), f);
      tf.text = "Music pos";
      tf.maxWidth = 70;
      tf.textAlign = Right;
      f.addChild(slider);
      f.addChild(musicPosition);
      pitchSlider = addSlider("Pitch val", function() { return pitchFilter.value; }, function(v) { pitchFilter.value = v; }, 0, 2);
      addCheck("Pitch shift", function() { return pitchShift; }, function (v) { pitchShift = v; });
      addSlider("Lowpass gain", function() { return lowpass.gainHF; }, function(v) { lowpass.gainHF = v; }, 0, 1);
      addText("Spatialization");
      addSlider("X", function() { return spatial.position.x; }, function(v) { spatial.position.x = v; }, -10, 10);
      addSlider("Y", function() { return spatial.position.y; }, function(v) { spatial.position.y = v; }, -10, 10);
      addSlider("Z", function() { return spatial.position.z; }, function(v) { spatial.position.z = v; }, -10, 10);
      addText("Spatialization Listener");
      var listener = hxd.snd.Manager.get().listener;
      addSlider("X", function() { return listener.position.x; }, function (v) { listener.position.x = v; }, -10, 10);
      addSlider("Y", function() { return listener.position.y; }, function (v) { listener.position.y = v; }, -10, 10);
      addSlider("Z", function() { return listener.position.z; }, function (v) { listener.position.z = v; }, -10, 10);
    }
  }

  override function update(dt:Float) {
    if ( beeper ) {
      time += dt;
      if( time > 1 ) {
        time--;
        hxd.Res.sound_fx.play();
        engine.backgroundColor = 0xFFFF0000;
      } else
        engine.backgroundColor = 0;
    }

    if ( pitchShift ) {
      pitchFilter.value = Math.max(Math.cos(hxd.Timer.lastTimeStamp / 4) + 1, 0.1);
      pitchSlider.value = pitchFilter.value;
      pitchSlider.onChange();
    }

    if( music != null ) {
      slider.value = music.position / music.duration;
      musicPosition.text = hxd.Math.fmt(music.position) + "/" + hxd.Math.fmt(music.duration);
      if( hxd.Key.isPressed(hxd.Key.M) ) {
        music.mute = !music.mute;
      }
    }

    if( hxd.Key.isPressed(hxd.Key.SPACE) ) {
      var c = new NoiseChannel();
      haxe.Timer.delay(c.stop, 1000);
    }
  }

  static function main() {
    hxd.Res.initEmbed();
    new Sound();
  }

}

View source on Github Open in new tab