【问题标题】:Trying to play multiple, selected files in Java/Processing in order of selection尝试按选择顺序在 Java/Processing 中播放多个选定的文件
【发布时间】:2017-03-30 17:40:44
【问题描述】:

我正在尝试编写 Java 代码,我可以在其中选择多个音频文件,并让脚本通过音乐可视化器按选择顺序播放文件。

我目前可以选择多个文件,但只能循环播放第一个文件。

这是我的代码:

import ddf.minim.*;
import ddf.minim.analysis.*;
import javax.swing.JFileChooser;
import processing.pdf.*;
PImage mouseCursor;
Minim         minim;
AudioPlayer   player;
AudioMetaData meta;
BeatDetect    beat;
FFT           fft;
int           w;
float         rad = 70;
int           r   = 2000;

void setup() {
  beginRecord(PDF, "/Users/Luke/Desktop/Processing Projects and     Files/f.pdf");
  fullScreen();  
  JFileChooser chooser = new JFileChooser();
  chooser.setMultiSelectionEnabled(true);
  chooser.setFileFilter(chooser.getAcceptAllFileFilter());
  //chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
  int returnVal = chooser.showOpenDialog(null);
  minim = new Minim(this);
  player =                 minim.loadFile(chooser.getSelectedFile().getAbsolutePath());
  meta = player.getMetaData();
  beat = new BeatDetect();
  player.loop();
  //player.isLooping();
  fft = new FFT(player.bufferSize(), player.sampleRate());
  fft.logAverages(60, 7);
  noStroke();
  w = width/fft.avgSize();
  background(0);
}
void draw() {
  noCursor();
  background(0);
  fill(255);
  fft.forward(player.mix);
  //stroke(255);
  stroke(random(255), random(255), random(255));
  for (int i = 0; i < fft.avgSize(); i++) {
    line((i * w) + (w / 2), height, (i * w) + (w / 2), height -                     fft.getAvg(i) * 4);
    strokeWeight(20);
  }
  beat.detect(player.mix);
  fill(0, 20);
  noStroke();
  rect(0, 0, width, height);
  //translate(width/1, height/50);
  noFill();
  fill(-1, 0);
  if (beat.isOnset()) rad = rad * 0.9f;
    else rad = 70;
  ellipse(0, 0, 2 * rad, 2 * rad);
  strokeCap(PROJECT);
  stroke(-1, 30);
  int bsize = player.bufferSize();
  for (int i = 0; i < bsize - 1; i += 5) {
    float x = 4 * (r)*cos(i*2*PI/bsize);
    float y =  4 * (r)*sin(i*2*PI/bsize);
    float x2 = 4 * (r + player.left.get(i)*100)*cos(i*2*PI/bsize);
    float y2 = 4 * (r + player.left.get(i)*100)*sin(i*2*PI/bsize);
    line(x, y, x2, y2);
  }
}
void keyPressed() {
  if (key==' ')exit();
  if (key=='s' || key=='S')endRecord();
}

目前它只播放一个文件并循环播放

非常感谢您的帮助

K

【问题讨论】:

    标签: java audio processing


    【解决方案1】:

    您需要break your problem down into smaller steps 并且一次只关注其中一个步骤。

    例如,您可能应该创建一个使用JFileChooser 的单独草图,以允许用户选择多个文件。不用担心播放它们,只需将它们的名字打印到控制台即可。您应该阅读the Java API 以了解有用的功能。

    当你让它完美运行时,你可以考虑获得点击顺序。这更高级,但谷歌是你的朋友,here 是一个有一些有希望的答案的问题。同样,您应该在其自己的小示例草图中执行此操作。不要担心播放音频文件。只需将它们打印到控制台即可。

    除此之外,创建一个使用硬编码数组或ArrayList 音频文件的草图并按顺序播放它们。让它与文件选择逻辑分开工作。

    当您让它们全部独立工作时,将它们组合成一个草图会容易得多。如果您在某个特定步骤上遇到困难,那么您可以发布一个MCVE 就在那个步骤,我们将从那里开始。祝你好运。

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 1970-01-01
      • 2014-04-08
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2010-10-23
      • 1970-01-01
      相关资源
      最近更新 更多