Cómo reproducir un sonido

Para reproducir un sonido, por ejemplo cuando se pulse una tecla determinada, usamos la librería Minim. Una librería es un conjunto de subprogramas que amplían la funcionalidad de otro (o de un lenguaje en este caso) más allá de aquella para la que se concibió.

Mimin está incluida en Processing y para usarla basta con importarla mediante el código:

import ddf.minim.*;

Luego instanciamos un objeto Minim

Minim soundengine;
AudioSample sonido1;

En setup() cargamos un archivo de audio que previamente hemos guardado en la carpeta data.

void setup() {
  soundengine = new Minim(this);
  sonido1 = soundengine.loadSample("01.mp3", 1024);
}

Luego hacemos que el objeto se dispare al pulsar una tecla

void draw() {
}
 
void keyPressed() {
  if (key == 'b' || key == 'B') {
    sonido1.trigger();
  }
}

Más información básica sobre el uso de sonidos mediante Minim en su Quickstart Guide

32 Comments

    • En la carpeta donde tienes tu sketch creas una carpeta llamada ‘data’. Y dentro de esa carpeta guardas el archivo.

      Disculpa la tardanza, no he visto el comentario hasta hoy.

      Reply
    • Hola Delton. Minim es una librería que permite reproducir sonido desde Processing. Está incluida, por lo que no necesitas instalarla, sólo importarla al principio de tu sketch con este código:

      import ddf.minim.*;

      Reply
  1. Hola! me sirvio un monton el tuto. Hay forma de que al obtener un dato en el serial ej “2” se reproduzca el archivo 2.mp3? el numero dos ya lo puedo guardar en una variable, lo que no logro es que la variable se iguale con el nombre del mp3.

    Gracias!

    Reply
  2. Buen día!
    espero me puedas ayudar.
    Cargue 3 archivos, necesito que estos se reproduzcan según las condiciones pero que se puedan pausar. puse “if” pero para detenerlas al ponerle código a cada una me lo marca como error por que se repite.

    if (weather.getTemperature()>=18){ //Cambiar temperatura
    sol.isPlaying();
    }
    if (weather.getTemperature()<18){ //Cambiar temperatura
    nublado.isPlaying();
    }
    else if(weather.getTemperature()<18){ //Cambiar temperatura
    calor.isPlaying();
    }
    }

    void keyPressed()
    {
    if ( sol.isPlaying() )
    {
    sol.pause();
    }
    else
    {
    sol.loop();
    }
    }

    void keyPressed()
    {
    if ( nublado.isPlaying() )
    {
    nublado.pause();
    }
    else
    {
    nublado.loop();
    }
    }

    void keyPressed()
    {
    if ( calor.isPlaying() )
    {
    calor.pause();
    }
    else
    {
    calor.loop();
    }
    }

    Reply
  3. Tienes varias funciones keyPressed() con contenidos diferentes. Prueba a reunir todos los condicionales en un solo keyPressed().
    Por ejemplo:

    void keyPressed(){
    if(condición01){función01}
    else if(condición02){función02}
    else if(condición03){función03}
    else{funciónPorDefecto}
    }

    Reply
    • En lugar de invocar el sonido con el método .trigger() dentro de la función keypressed(), usa el método .loop() dentro de draw():

      void draw(){ sonido1.loop();}

      Reply
      • Saludos
        Escribi, sonido1.loop(); pero aparece que la funcion no existe, que podria ser? tengo el mismo codigo escrito aqui como ejemplo…

        Reply
    • Puedes hacer una serie de condicionales if / else if que comprueben si al hacer clic el mouse está dentro de los límites de la imagen. En pesudo-código sería:

      void mouseReleased(){
      si el mouse está más bajo que el límite superior (de la imagen)
      y además el mouse está más alto que el límite inferior
      y además el mouse está más a la derecha que el límite izquierdo
      y además el mouse está más a la izquierda que el límite derecho
      reproducir sonido
      }

      Reply
  4. Hola, me preguntaba si me podrías ayudar con un problema que me ha surgido al colocar este código en un juego que estoy creando. Consiste en el típico PONG en el que cuando metes la bola se reinicia y vuelve al juego. Yo lo que quiero es que suene una canción de fondo desde que se ejecuta el juego hasta que se cierra, el problema viene que cuando incluyo este código en el juego, cada vez que se mete punto, se reinicia la pelota se reinicia la canción sucesivamente (haciendo que se reproduzca simultáneamente la misma canción de manera que queda un eco molesto hasta que deja de entenderse completamente la canción).

    import ddf.minim.*;
    import ddf.minim.analysis.*;
    import ddf.minim.effects.*;
    import ddf.minim.signals.*;
    import ddf.minim.spi.*;
    import ddf.minim.ugens.*;

    Minim minim;
    AudioPlayer sou;

    void setup() {
    size (500,500,P2D);
    minim = new Minim (this);
    sou =minim.loadFile(“11111.mp3”);
    sou.loop();

    }

    void draw() {
    }

    Me gustaría saber como puedo hacer para que la canción se quede fija sin que el código del juego influya en el código de reproducción de la música. Gracias y un saludo.

    Reply
    • ¿Has probado a parar el sonido antes de reiniciar, sou.stop()? Donde tengas la función para reiniciar, junto antes o justo después. Ya me dices si funciona.

      Reply
      • Lo siento, no acabo de entender como hacerlo. Esta es la parte del programa que me de problemas (para que lo veas ya que alomejor no me explico muy bien);

        import ddf.minim.*;
        import ddf.minim.analysis.*;
        import ddf.minim.effects.*;
        import ddf.minim.signals.*;
        import ddf.minim.spi.*;
        import ddf.minim.ugens.*;

        Minim minim;
        AudioPlayer sou;

        int x, y, w, h, speedX, speedY;

        int scoreL = 0;
        int scoreR = 0;

        int winScore = 10;

        void setup() {

        size(1400, 500);

        minim = new Minim (this);
        sou =minim.loadFile(“song.mp3”);
        sou.loop();
        frameRate(150); //velocidad de la bola

        x = width/2;
        y = height/2;
        w = 20;
        h = 20;

        speedX = 2;
        speedY = 2;

        textSize(35);
        textAlign(CENTER, CENTER);
        rectMode(CENTER);

        }

        void draw() {
        background(225);
        drawCircle();
        moveCircle();
        bounceOff();
        scores();

        }

        void drawCircle() {
        fill(225,0,0);
        ellipse(x, y, w, h);
        }

        void moveCircle() {
        x = x + speedX*2;
        y = y + speedY*2;
        }

        void bounceOff() {
        if ( x > width – w/2) {
        setup();
        speedX = -speedX;
        scoreL = scoreL + 1;
        } else if ( x height – h/2) {
        speedY = -speedY;
        } else if ( y < 0 + h/2) {
        speedY = -speedY;
        }
        }

        void scores() {
        fill(255);
        text(scoreL, 100, 50); //posición del marcador 1
        text(scoreR, width-100, 50); //posición del marcador 2
        }

        void keyPressed() {
        if (keyCode == 'P') {
        noLoop();
        sou.pause();
        text("PAUSE", 200,100);
        text("Click R to continue",735,450);
        }else if(keyCode == 'R') {
        loop();
        sou.play();
        }
        }

        No sé colocar el sou.close() o el sou.stop(). Al poner el stop me dice que la función no existe. He encontrado la manera de que la música se reproduzca solo una vez con void keyPressed(), pero no me gusta la idea de que haya que pulsar una tecla para iniciar el sonido (un poco incomodo, ¿no?) y también si por casualidad vuelve a pulsar la tecla se duplica la canción como anteriormente. Si fuera posible que sonara desde que se inicia el programa hasta que se cierra sin necesidad de usar el keyPressed() sería perfecto y agradecería tu ayuda.

        Gracias y lamento las molestias

        Reply
  5. Hola,
    Tengo un audio en draw que se reproduce cuando mouseX está en un rango de valor x. ¿Cómo podría hacer para que el audio se reproduzca una sola vez? Ahora se carga una y otra vez mientras mouseX se encuentra en dicho rango.

    if (mouseX > 512 && mouseX < 640)
    {
    s4.play();
    }
    desde ya muchas gracias
    saludos

    Reply
    • Por ejemplo, puedes crear una función testMouse() que compruebe si el mouse está en el rango que quieres. Debes crear antes una una variable booleana global, ‘playsound’, y la das un valor de ‘false’. La nueva función le pasa el valor ‘true’ si el mouse está en su sitio.

      void testMouse(){
      if(mouseX > width/2){
      playsound = true;
      }
      }

      Y en draw() creas un condicional
      if (playsound){
      player.play();
      }

      …sin olvidarte de invocar la función testMouse().

      Así se reproduce una sola vez. Si quieres que deje de sonar al salir el mouse del rango establecido, puedes aladir un else if a tu conveniencia.

      ¡Saludos!

      Reply

Leave a Comment.