Audio Loop Processing.org (Java / библиотека минимального звука) - PullRequest
0 голосов
/ 24 января 2012

Я пытаюсь создать длинный фрагмент аудио, представляющий собой набор записанных аудиоклипов, которые со временем объединяются в один большой коллаж звуков. Я использую звуковую библиотеку Minim, но сейчас мне трудно заставить ее работать. Это работает точно так же, как Мои навыки программирования довольно просты, но я думал, что это будет очень простая задача! Я хочу, чтобы он работал точно так же, как 'RecordAndPlayback' в папке примеров Minim, но чтобы события, инициируемые щелчками, выполнялись автономно.

Вот код, который у меня есть:

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 Ответ

1 голос
/ 05 февраля 2012

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

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

Вот базовый эскиз с использованием измененного образца:

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();
}

Удачи!

...