Minim:Minim

[ javadoc | 范例 ]

Minim是你正在阅读的音频库的名字。Minim是在能提供一堆方法(method)给你获取系统音频资源的库里的一个类。要使用它,你必须在setup()之前申明一个Minm的变量,而后例示一个Minim对象。为了使Minm能够辨识一些东西并能够进入你sketch的data文件夹,你必须这么做。

示范代码

import ddf.minim.*;

Minim minim;

void setup()
{
  size(100, 100);

  minim = new Minim(this);
}

void draw()
{
}

获取Minim的音频资源

你可以用Minim做四件事:播放一个音频文件,播放合成音频,监听音频输入,向硬盘内录制音频。所有这些都是由库内不同的类操作的,这些类的范例通过呼叫Minim适当的方法而获得。

载入一个音频文件

有三个不同的类可用来播放一个音频文件,每种都用来配合特定的回放类型。接下来的课程会详尽的讲解每个类,现在你只需要知道他们是:AudioSnippet, AudioSample, 和 AudioPlayer。你通过呼叫如下Minim方法创建它们:

loadSnippet(String filename)
loadSample(String filename)
loadSample(String filename, int bufferSize)
loadFile(String filename)
loadFile(String filename, int bufferSize)

loadSnippet 返回 AudioSnippet,loadSample 返回 AudioSample, loadFile 返回 AudioPlayer。在任何情况下,filename(文件名)可以是你sketch里data文件夹下的音频文件的绝对路径,也可以是网路上的音频文件链接。bufferSize是你希望的缓冲器大小,这个数字越小,音频的延迟越少。

示范代码

import ddf.minim.*;

Minim minim;
AudioPlayer in;

void setup()
{
  size(512, 200);
  // 例示一个Minim对象
  minim = new Minim(this);
  // 载入一个文件,默认采样率为1024
  in = minim.loadFile("music.mp3");
  // 播放这个文件
  in.play();
}

void draw()
{
  // 做爱做的事
}

void stop()
{
  // 别忘记关闭音频输入输出类
  in.close();
  // 别忘记停止你的Minim对象
  minim.stop();

  super.stop();
}

获得一个AudioOutput(音频输出)

Minim为回放合成音频提供AudioOutput类。这是实时经由你程序创建并反馈到扬声器的音频。AudioOutput支持单声道及立体声,并且可指定你需要的合成类型。方法如下:

getLineOut()
getLineOut(int type)
getLineOut(int type, int bufferSize)
getLineOut(int type, int bufferSize, float sampleRate)
getLineOut(int type, int bufferSize, float sampleRate, int bitDepth)

type指出你想要单声道还是立体声。你应当使用Minim.MONO或Minim.STEREO作为这个引数的值,这个引数的默认值为Minim.STEREO。bufferSize如上,即你缓冲器的大小。sampleRate是你合成音频的采样率,默认值为44100(CD音频质量)。bitDepth是你合成音频的比特率,目前仅支持8和16两个值,默认值为16(CD音频质量)。注意有时你填入的值将超出你的设备允许范围,这时,这个方法将会返回null,发生这种情况并不意味着你完全无法获得一个输出,而只是表明你想要的是一个无法实现的配置。

示范代码

import ddf.minim.*;
import ddf.minim.signals.*;

Minim minim;
AudioOutput out;
SineWave sine;

void setup()
{
  size(512, 200);
  // 例示一个Minim对象
  minim = new Minim(this);
  // 通过Minim获得一个线性输出, 
  // 默认采样率为44100,采样深度16
  out = minim.getLineOut(Minim.STEREO, 512);
  // 创建一个振荡器, 频率440 Hz, 振幅0.5, 
  // 采样率44100以符合线性输出
  sine = new SineWave(440, 0.5, 44100);
  // 将振荡器加到输出上
  out.addSignal(sine);
}

void draw()
{
  // 做爱做的事
}

void stop()
{
  // always closes audio I/O classes
  out.close();
  // always stop your Minim object
  minim.stop();

  super.stop();
}

获得一个AudioInput(音频输入)

Minim为监听用户当前录音源提供了AudioInput类。目前我们无法指定这个输入的来源,比如麦克或线性输入。

getLineIn()
getLineIn(int type)
getLineIn(int type, int bufferSize)
getLineIn(int type, int bufferSize, float sampleRate)
getLineIn(int type, int bufferSize, float sampleRate, int bitDepth)

type指出你想要单声道还是立体声。你应当使用Minim.MONO或Minim.STEREO作为这个引数的值,这个引数的默认值为 Minim.STEREO。bufferSize如上,即你缓冲器的大小。sampleRate是你合成音频的采样率,默认值为44100(CD音频质 量)。bitDepth是你合成音频的比特率,目前仅支持8和16两个值,默认值为16(CD音频质量)。注意有时你填入的值将超出你的设备允许范围,这 时,这个方法将会返回null,发生这种情况并不意味着你完全无法获得一个输出,而只是表明你想要的是一个无法实现的配置。

示范代码

import ddf.minim.*;

Minim minim;
AudioInput in;

void setup()
{
  size(512, 200);
  // instatiate a Minim object
  minim = new Minim(this);
  // get a line out from Minim, 
  // default sample rate is 44100, bit depth is 16
  in = minim.getLineIn(Minim.STEREO, 512);
}

void draw()
{
  // do whatever you are going to do
}

void stop()
{
  // 别忘记关闭音频I/O类
  in.close();
  // 别忘记停止你的Minim对象
  minim.stop();

  super.stop();
}

创建一个AudioRecorder(音频录制机)

Minim为录制音频数据到硬盘提供AudioRecorder类。细节的讨论将后续说明,以下是获取一个AudioRecorder的方法:

createRecorder(Recordable source, String filename, boolean buffered)

source是一个你希望作为录音源的可记录对象。filename是要保存的音频文件的名字,包括扩展名。buffered表明你希望或不希望在录音过程中使用缓冲器。

示范代码

import ddf.minim.*;

Minim minim;
AudioInput in;
AudioRecorder fout;

void setup()
{
  size(512, 400);

  minim = new Minim(this);

  // 获得一个立体声线性输入: 缓冲器512
  in = minim.getLineIn(Minim.STEREO, 512);
  // 获取一个录音机 
  // 并使用缓冲录音的方式将声音录入指定文件名及类型的文件
  fout = minim.createRecorder(in, "myrecording.wav", true);
}

void draw()
{
  // 做爱做的事
}

void keyReleased()
{
  // 可以设置控制录音起始的键盘按键
  // 然后存至硬盘
}

void stop()
{
  // always close audio I/O classes
  in.close();
  // always stop your Minim object
  minim.stop();

  super.stop();
}

设置系统混音器(Mixer)

Javasound(Java声音)通过使用一个叫做Mixer(混音器)的对象提供进入电脑系统特定输入、输出口的能力。你可以在创建资源之前设置输入输出混音器来指定特定的输入或输出。AudioPlayer, AudioSnippet, AudioSample, 和 AudioOuput都使用输出混音器来获得音频输出。AudioInput则使用输入混音器。例如,如果你有一块多通道声卡,你可以为你的音频输出指定它特定的输出口。

示范代码在线示例

import ddf.minim.*;
// 需要SineWave信号包
import ddf.minim.signals.*;
import controlP5.*;
// 为使用Mixer 和 Mixer.Info对象,我们需要导入这个
import javax.sound.sampled.*;

Minim minim;
AudioOutput out;
// 一个展示整个音频系统混音器的info对象的数组。
// 我们用它组装我们的混音器下拉菜单,并让用户选择想要的混音器。
Mixer.Info[] mixerInfo;

// 给我们输出的一个信号
SineWave sine;

ControlP5 gui;

void setup()
{
  size(512, 275);

  minim = new Minim(this);
  gui = new ControlP5(this);

  ScrollList mixers = gui.addScrollList("Mixers", 10, 10, 475, 280);
  mixers.setLabel("Choose A Mixer");

  mixerInfo = AudioSystem.getMixerInfo();

  for(int i = 0; i < mixerInfo.length; i++)
  {
    controlP5.Button b = mixers.addItem("item"+i, i);
    b.setLabel(mixerInfo[i].getName());
  }

  sine = new SineWave(220, 0.3, 44100);

}

void draw()
{
  background(0);

  //gui.draw();

  if ( out != null )
  {
    stroke(255);
    // 绘制波形
    for(int i = 0; i < out.bufferSize() - 1; i++)
    {
      line(i, 50 + out.left.get(i)*50, i+1, 50 + out.left.get(i+1)*50);
      line(i, 150 + out.right.get(i)*50, i+1, 150 + out.right.get(i+1)*50);
    }
  }
}

public void controlEvent(ControlEvent theEvent)
{
  int mixerIndex = (int)theEvent.controller().value();

  println("User chose " + theEvent.controller().label());
  println("Using mixer info " + mixerInfo[mixerIndex].getName());

  Mixer mixer = AudioSystem.getMixer(mixerInfo[mixerIndex]);

  minim.setOutputMixer(mixer);

  if ( out != null )
  {
    out.close();
  }

  out = minim.getLineOut(Minim.STEREO);

  if ( out != null )
  {
    out.addSignal(sine);
  }
}

void stop()
{
  // 完事后记得关闭Minim音频类
  if ( out != null )
  {
    out.close();
  }
  minim.stop();

  super.stop();
}

同样的,你可以指定你声卡特定的输入:

示范代码在线示例

import ddf.minim.*;
import controlP5.*;
// need to import this so we can use Mixer and Mixer.Info objects
import javax.sound.sampled.*;

Minim minim;
AudioInput in;
// an array of info objects describing all of 
// the mixers the AudioSystem has. we'll use
// this to populate our gui scroll list and
// also to obtain an actual Mixer when the
// user clicks on an item in the list.
Mixer.Info[] mixerInfo;

ControlP5 gui;

void setup()
{
  size(512, 275);

  minim = new Minim(this);
  gui = new ControlP5(this);

  ScrollList mixers = gui.addScrollList("Mixers", 10, 10, 475, 280);
  mixers.setLabel("Choose A Mixer");

  mixerInfo = AudioSystem.getMixerInfo();

  for(int i = 0; i < mixerInfo.length; i++)
  {
    controlP5.Button b = mixers.addItem("item"+i, i);
    b.setLabel(mixerInfo[i].getName());
  }

}

void draw()
{
  background(0);

  //gui.draw();

  if ( in != null )
  {
    stroke(255);
    // draw the waveforms
    for(int i = 0; i < in.bufferSize() - 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);
    }
  }
}

public void controlEvent(ControlEvent theEvent)
{
  int mixerIndex = (int)theEvent.controller().value();

  println("User chose " + theEvent.controller().label());
  println("Using mixer info " + mixerInfo[mixerIndex].getName());

  Mixer mixer = AudioSystem.getMixer(mixerInfo[mixerIndex]);

  if ( in != null )
  {
    in.close();
  }

  minim.setInputMixer(mixer);

  in = minim.getLineIn(Minim.STEREO);

}

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

  super.stop();
}

《Minim:Minim》有2个想法

  1. 额,好像所有关于MINIM的文章,都是跟网页代码混乱了的。。。

    Reply

    ww Reply:

    是的,暂时没时间修改,等有时间会慢慢全部重新改过

    Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.