2012-01-24 7 views
0

Я пытаюсь создать длинную часть аудио, которая представляет собой коллекцию записанных аудиоклипов, которые со временем сливаются в один большой коллаж звуков. Я использую звуковую библиотеку Minim, но на данный момент мне нелегко заставить это работать. Это работает точно так же, как мои навыки программирования довольно простые, но я думал, что это будет очень простая задача! Я: ant, чтобы он работал точно так же, как «RecordAndPlayback» в папке примеров Minim, но чтобы события были инициированы кликами, выполненными автоматически.Audio Loop Processing.org (Java/Minim sound Library)

Вот код, который я до сих пор:

import ddf.minim.*; 
Minim minim; 
AudioInput in; 
AudioRecorder recorder; 
AudioPlayer player; 
Timer timer; 
class Timer { 

    int savedTime; // When Timer started 
    int totalTime; // How long Timer should last 

    Timer(int tempTotalTime) { 
    totalTime = tempTotalTime; 
    } 

    // Starting the timer 
    void start() { 
    // When the timer starts it stores the current time in milliseconds. 
    savedTime = millis(); 
    } 

    // The function isFinished() returns true if 5,000 ms have passed. 
    // The work of the timer is farmed out to this method. 
    boolean isFinished() { 
    // Check how much time has passed 
    int passedTime = millis()- savedTime; 
    if (passedTime > totalTime) { 
     return true; 
    } else { 
     return false; 
    } 
    } 
} 
void setup() 
{ 
    size(512, 200, P3D); 
    textMode(SCREEN); 
    minim = new Minim(this); 
    timer = new Timer(5000); 
    timer.start(); 
    in = minim.getLineIn(Minim.STEREO, 2048); 
    recorder = minim.createRecorder(in, "myrecording.wav", true); 

    textFont(createFont("Arial", 12)); 
} 
void draw() 
{ 
    background(0); 
    player = minim.loadFile("myrecording.wav"); 
    player.play(); 
    player.loop(); 
//GUI 
    stroke(255); 
    for(int i = 0; i < in.left.size()-1; i++) 
    { 
    line(i, 50 + in.left.get(i)*50, i+1, 50 + in.left.get(i+1)*50); 
    line(i, 150 + in.right.get(i)*50, i+1, 150 + in.right.get(i+1)*50); 
    } 
    //-- end of GUI 
//recorder switching 
    if (timer.isFinished()) 
    { 
    text("not..", 5, 15); 
    if(recorder.isRecording() == true){ 
    recorder.endRecord(); 
    recorder.save(); 
    timer.start(); 
    } 
    }else 
    { 
    text("recording...", 5, 15); 
    recorder.beginRecord(); 
    println(recorder.isRecording()); 
    } 
    ///--- end recorder switching 

} 
void stop() 
{ 
    // always close Minim audio classes when you are done with them 
    in.close(); 
    if (player != null) 
    { 
    player.close(); 
    } 
    minim.stop(); 

    super.stop(); 
} 

Пожалуйста, любая помощь будет очень приветствуется, поскольку это сводит меня с ума!

Благодаря

Daniel

ответ

1

Вы, кажется, обрабатывать только один файл, и вы не загружаются, что вы записываете.

Если вы хотите включать и выключать запись, вы можете использовать логическое значение для отслеживания, чем, а затем сохранить записанное.

Вот основной эскиз с помощью модифицированного образца:

import ddf.minim.*; 

Minim minim; 
AudioInput in; 
AudioRecorder recorder; 
AudioPlayer player; 

boolean isRecording;//are we recording ? 

void setup(){ 
    size(512, 200); 
    minim = new Minim(this); 
    in = minim.getLineIn(Minim.STEREO, 512); 
    recorder = minim.createRecorder(in, "rec.wav", true); 
    textFont(createFont("Arial", 12)); 
} 

void draw(){ 
    background(isRecording ? color(192,0,0) : color(0)); 
    stroke(255); 
    for(int i = 0; i < in.left.size()-1; i++){ 
    line(i, 50 + in.left.get(i)*50, i+1, 50 + in.left.get(i+1)*50); 
    line(i, 150 + in.right.get(i)*50, i+1, 150 + in.right.get(i+1)*50); 
    } 
    if (recorder.isRecording()) text("Currently recording...", 5, 15); 
    else       text("Not recording.", 5, 15); 

} 

void keyReleased(){ 
    if (key == 'r'){ 
    isRecording = !isRecording;//toggle recording 
    if(isRecording){//if we need to record 
     if(player != null && player.isPlaying()) player.pause();//stop any previously playing tracks, if any 
     if(recorder.isRecording()) recorder.endRecord();//and the previous recording somehow wasn't ended, end it now 
     recorder.beginRecord();//begin recording, according to docs: "If recording was previously halted, and save() was not called, samples will be appended to the end of the material recorded so far." 
    }else recorder.endRecord();//stop recording 
    } 
    if (key == 's'){ 
    if(recorder != null) { 
     recorder.save(); 
     println("Done saving "); 
     player = minim.loadFile("rec.wav", 2048); 
     player.play(); 
    } 
    } 
} 

void stop(){ 
    in.close(); 
    minim.stop(); 
    super.stop(); 
} 

Если по какой-то причине вы хотите сохранить каждую запись в отдельный файл, а один, вы могли бы использовать некоторые целые числа, чтобы держать идентификатор записи и образец воспроизведения.

import ddf.minim.*; 

Minim minim; 
AudioInput in; 
AudioRecorder recorder; 
AudioPlayer player; 

boolean isRecording; 

int recID = -1; 
int playID = 0; 

void setup(){ 
    size(512, 200); 
    minim = new Minim(this); 
    in = minim.getLineIn(Minim.STEREO, 512); 
    textFont(createFont("Arial", 12)); 
} 

void draw(){ 
    background(0); 
    stroke(255); 
    for(int i = 0; i < in.left.size()-1; i++){ 
    line(i, 50 + in.left.get(i)*50, i+1, 50 + in.left.get(i+1)*50); 
    line(i, 150 + in.right.get(i)*50, i+1, 150 + in.right.get(i+1)*50); 
    } 
    if(recorder != null){ 
    if (recorder.isRecording()) text("Currently recording...", 5, 15); 
    else       text("Not recording.", 5, 15); 
    } 
    if(player != null && !isRecording){ 
    println("playing: " + playID); 
    if(player.position() >= player.length()){ 
     if(playID < recID){ 
     playID++; 
     player = minim.loadFile("rec"+playID+".wav", 2048); 
     player.play(); 
     } 
    } 
    } 
} 

void keyReleased(){ 
    if (key == 'r'){ 
    if(recorder != null && recorder.isRecording()) recorder.endRecord(); 
    else{ 
    recID++; 
    recorder = minim.createRecorder(in, "rec"+recID+".wav", true); 
    recorder.beginRecord(); 
    } 
    isRecording = true; 
    } 
    if (key == 's'){ 
    if(recorder != null) { 
     recorder.save(); 
     println("Done saving " + recID); 
     player = minim.loadFile("rec"+recID+".wav", 2048); 
     player.play(); 
     isRecording = false; 
    } 
    } 
    if (key == 'p'){//play all 
    playID = 0; 
    player = minim.loadFile("rec"+playID+".wav", 2048); 
    player.play(); 
    } 
} 

void stop(){ 
    in.close(); 
    minim.stop(); 
    super.stop(); 
} 

Goodluck!