Audio Loop Processing.org(Java/Minim 声音库)
Posted
技术标签:
【中文标题】Audio Loop Processing.org(Java/Minim 声音库)【英文标题】:Audio Loop Processing.org (Java/Minim sound Library) 【发布时间】:2012-01-24 17:17:47 【问题描述】:我正在尝试创建一段很长的音频,它是录制的音频剪辑的集合,这些剪辑及时合并成一个大的声音拼贴画。我正在使用 Minim 声音库,但目前我很难让它工作。这与我的编程技能相当基本相同,但我认为这将是一项非常容易的任务!我:ant 它与 Minim 的示例文件夹中的“RecordAndPlayback”完全相同,但要让点击触发的事件自动完成。
这是我目前的代码:
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();
欢迎任何帮助,因为这让我发疯!
谢谢
丹尼尔
【问题讨论】:
【参考方案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();
如果出于某种原因您想将每个录音保存到一个单独的文件中,而不是一个,您可以使用一些整数来保存录音的 id 和正在播放的样本。
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();
祝你好运!
【讨论】:
以上是关于Audio Loop Processing.org(Java/Minim 声音库)的主要内容,如果未能解决你的问题,请参考以下文章