User Tools

Site Tools


javascript:electronic-music-tools:3.4_load_and_play_a_sample

[load and play a sample code](https://live.codecircle.com/d/HfvHJWxKLPJBxYpTW) [une collection de samples de batterie gratuits par Alex McLean](https://github.com/tidalcycles/Dirt-Samples)

https://live.codecircle.com/d/KXB8oApK6uN4Syxpc

javascript

var contexte_audio = window.AudioContext || window.webkitAudioContext;

var contexte = new contexte_audio();

var instruments = {};

function charger_un_sample ( url, nom ) {
  /* charge un sample dont l'URL est donnée en paramètre 1 et le place dans l'objet instrument à l'emplacement de la clé donnée
  String, Function -> Void */

  // on créé l'objet requête
  var requete = new XMLHttpRequest();

  // que l'on paramètre :

  // 1 : requête GET, url de la requête, requête asynchrone : true
  requete.open('GET', url, true);

  // 2 : type de réponse
  requete.responseType = 'arraybuffer';

  // 3 : écouteur onload et fonction a exécuter alors
  requete.onload = function () {

    // les données audio
    var donnees_audio = requete.response;

    // sont passées pour décodage au contexte audio
    contexte.decodeAudioData( donnees_audio, function( buffer ) {

      // on ajoute le buffer à notre objet instruments
      instruments[nom] = buffer;
    });
  };

  // on envoie la requête
  requete.send();
}


charger_un_sample( 'cl_hat_3001.wav', 'charleston');

function charleston(){
  var player = contexte.createBufferSource();
  player.buffer = instruments.charleston;
  player.start();
  player.loop = false;
  player.connect(contexte.destination);
}

document.addEventListener( 'keyup', function ( evenement ) {
  charleston();
}, false);

samples_set.js

function Samples_set ( contexte ) {
  /* Set de samples permettant de charger simplement des samples et de les jouer */
  this.contexte = contexte;
  this.samples_set = {};
}

Samples_set.prototype.charger = function ( nom, url ) {
  /* Charge le sample et l'ajoute au set
  String, String -> Void */

  // on créé une référence à this (notre occurence de Sample_set)
  var self = this;

  // on créé l'objet requête
  var requete = new XMLHttpRequest();

  // que l'on paramètre :

  // 1 : requête GET, url de la requête, requête asynchrone : true
  requete.open('GET', url, true);

  // 2 : type de réponse
  requete.responseType = 'arraybuffer';

  // 3 : écouteur onload et fonction à exécuter alors
  requete.onload = function () {

    // les données audio
    var donnees_audio = requete.response;

    // sont passées pour décodage au contexte audio
    contexte.decodeAudioData( donnees_audio, function( buffer ) {

      // on ajoute le buffer à notre objet instruments
      self.samples_set[nom] = buffer;
    });
  };

  // on envoie la requête
  requete.send();
};

Samples_set.prototype.jouer = function ( nom ) {
  /* Joue le sample s'il est trouvé
    String -> Void */

  // si le sample existe, a été chargé
  if ( this.samples_set[nom] ) {
    try {

      //on créé un BufferSource
      var player = contexte.createBufferSource();

      // on y charge notre sample
      player.buffer = this.samples_set[nom];

      // on spécifie qu'on ne le joue pas en boucle
      player.loop = false;

      // on le connecte au contexte
      player.connect(this.contexte.destination);

      // on le lance
      player.start();

    // en cas d'erreur
    } catch (e) {
      console.error('erreur : Samples_set.jouer :', e);
    }
  }
};

var contexte_audio = window.AudioContext || window.webkitAudioContext;

var contexte = new contexte_audio();

var batterie = new Samples_set( contexte );

batterie.charger( 'charleston', 'cl_hat_3001.wav');

document.addEventListener( 'keyup', function ( evenement ) {
  batterie.jouer('charleston');
}, false);
javascript/electronic-music-tools/3.4_load_and_play_a_sample.txt · Last modified: 2017/07/19 22:49 by leo