PlayWav

Author: Kees van den Doel


A "Hello World" program using a number of loops of the same recording.

Source code:

import jass.render.*;
import jass.engine.*;
import jass.generators.*;
import java.net.*;

/**
   Play some looping wav file in chorus.
   @author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class PlayWavApplet extends AppletController {
    SourcePlayer player;
    LoopBuffer[] loopbuffer;
    Mixer mixer;
    int nvoices = 5;
    boolean isOn = false;
    float speed = 1;
    String wavfile =  "../data/hello.wav";
    
    public void setNSliders() {
        nsliders = nvoices*2;
    }
   
    public void setNButtons() {
        nbuttons = 1;
    }
    
    public void init() {
        super.init();
        wavfile = getParameter("wavfile");
    }
    
    public void start() {
        float srate = 44100.f;
        int bufferSize = 128*4;
        int bufferSizeJavaSound = 8*1024;
        loopbuffer = new LoopBuffer[nvoices];
        URL codebase = getCodeBase();
        URL wavurl = null;
        try {
            wavurl = new URL(codebase,wavfile);
        } catch(MalformedURLException e) {
            System.out.println(e+" Malformed URL: " +codebase+" "+ wavfile);
        }
        loopbuffer[0] = new LoopBuffer(srate,bufferSize,wavurl);
        float[] wavArray = loopbuffer[0].getLoopBuffer();
        for(int i=1;i < nvoices;i++) {
            loopbuffer[i] = new LoopBuffer(srate,bufferSize,wavArray);
        }
        mixer = new Mixer(bufferSize,nvoices);

        for(int i=0;i < nvoices;i++) {
            mixer.setGain(i,1);
        }
        player = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate);
        try {
            player.addSource(mixer);
            for(int i=0;i < nvoices;i++) {
                mixer.addSource(loopbuffer[i]);
            }
        } catch(SinkIsFullException e) {
        }
        String[] names = new String[2*nvoices];
        double[] val = new double[2*nvoices];
        double[] min = new double[2*nvoices];
        double[] max = new double[2*nvoices];
        for(int i=0;i < nvoices;i++) {
            names[i] = "Speed" + i+" ";
            val[i] = (float)(.95 + i/20.);
            min[i] = .2f;
            max[i] = 5f;
        }
        for(int i=nvoices;i < 2*nvoices;i++) {
            names[i] = "Volume" + i+" ";
            val[i] = 1f;
            min[i] = 0;
            max[i] = 1f;
        }
        for(int i=0;i < nvoices;i++) {
            loopbuffer[i].setSpeed((float)val[i]);
        }
        setValues(val,min,max,names);
        jButton[0].setText ("Stop");
        
        player.start();
        isOn = true;
    }

    protected void jButtonMousePressed (int k, java.awt.event.MouseEvent evt) {
        switch(k) {
        case 0:
            if(isOn) {
                jButton[0].setText ("Start");
                isOn = false;                
                for(int i=0;i < nvoices;i++) {
                    loopbuffer[i].setVolume(0);
                }
            } else {
                jButton[0].setText ("Stop");
                isOn = true;
                player.resetAGC();
                for(int i=0;i < nvoices;i++) {
                    loopbuffer[i].setVolume(1);
                }
            }
            break;
        }

    }
    
    protected void onSlider(int k) {
        if(k < nvoices) {
            loopbuffer[k].setSpeed((float)this.val[k]);
        } else {
            mixer.setGain(k - nvoices,(float)this.val[k]);
        }
    }
    
}