【问题标题】:Adding import button to music player将导入按钮添加到音乐播放器
【发布时间】:2014-05-03 20:24:05
【问题描述】:

我正在尝试使功能导入按钮成为可能,我的意思是我单击该按钮,文件浏览器弹出,我可以单击一首歌曲,然后播放器可以播放它。就像任何其他音乐播放器一样。这是迄今为止我的代码的基本视图,不包括类:

import ddf.minim.spi.*;
import ddf.minim.*; 
import ddf.minim.signals.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import ddf.minim.ugens.*;
boolean play;
boolean repeat;
int k;
String filename;//
Minim minim;
AudioPlayer player;

Pics p;
Mechs m;
Importbt b;
ArrayList<Songs> s;
int i=0;
void setup() {
size(600, 400);
b=new Importbt();
m=new Mechs();
p=new Pics();
p.Thepics();

minim=new Minim(this);
s = new ArrayList();
s.add(new Songs(player, "SONG 1", "SONG 1"));
s.add(new Songs(player, "SONG 2", "SONG 2"));
s.add(new Songs(player, "SONG 3", "SONG 3"));
s.add(new Songs(player, "SONG 4", "SONG 4"));
k = s.size()-1;
}
void draw() {
background(0);
p.getFunction();
}

void fileSelected(File selection) {
if (selection == null) {
} 
else {
filename = selection.getAbsolutePath();
player = minim.loadFile(filename);//loads the file
// s.add(k, new Songs(player, filename, "a song"));
//s.get(k).playmusic();
s.add(new Songs(player, filename, "ftyu"));
s.get(k).waveform();//function from my songs class
player.play();//plays the file

至于我的班级,如果需要的话

class Songs {
AudioPlayer song; 
String directory;
String songName;
Songs(AudioPlayer song, String directory, String songName) {

song=minim.loadFile(directory);

this.song=song;
this.songName=songName;
}
void waveform() {
for (int j = 1; j < song.bufferSize() - 1; j++)
{
  if (j>0) {

    line(j, 214  + song.left.get(j)*50, j+1, 214 + song.left.get(j+1)*50);
    //waves from the left.
    stroke( 255, 0, 0 );  //this is the colour of the first line (red)
    line(j, 214 + song.right.get(j)*50, j+1, 214 + song.right.get(j+1)*50);
    //waves from the right.
    stroke(255, 255, 0);

  }
}

【问题讨论】:

    标签: button import processing minim


    【解决方案1】:

    这里有一些东西可以帮助你:

    import ddf.minim.spi.*;
    import ddf.minim.signals.*;
    import ddf.minim.*;
    import ddf.minim.analysis.*;
    import ddf.minim.ugens.*;
    import ddf.minim.effects.*;
    
    float buttonX;
    float buttonY;
    float buttonW;
    float buttonH;
    
    Minim minim;
    AudioPlayer player;
    
    String filename;
    
    void setup() {
    
      textSize(24);
    
      frame.setResizable(false);
    
      background(255);
    
      size(600, 200);
    
      fill(0);
      stroke(0);
      noFill();
    
      buttonW = 200;
      buttonH = 50;
      buttonX = width - width/2 - buttonW/2;
      buttonY = height/2 - buttonH/2;
    
      // Minim stuff
      minim = new Minim(this);
    }
    
    void draw() {
    
      background(255);
      fill(0);
    
      rectMode(CORNER);
    
      rect(buttonX, buttonY, buttonW, buttonH);
    
      fill(255);
    
      textAlign(LEFT);
      text("Import File", buttonX+35, buttonY+30);
    }
    
    void mouseClicked() {
      if (mouseX>buttonX && mouseX < buttonX+buttonW && mouseY > buttonY && mouseY < buttonY+buttonH) {
        selectInput("Import music file", "fileSelected");
      }
    }
    
    /* Taken from Processing.org */
    void fileSelected(File selection) {
      if (selection == null) {
        println("Window was closed or user hit cancel");
      } else {
        filename = selection.getAbsolutePath();
        player = minim.loadFile(filename);
        player.play();
        println("User selected " + filename);
      }
    }
    
    // stop minim and the player.
    void stop() {
      player.close();
      minim.stop();
      super.stop();
    }
    

    这是一个非常简单的例子。所有这一切都是为MinimAudioPlayer 创建对象,然后使用文件选择机制将文件的路径和名称提供给loadFile(filename)。然后,如果该文件是合法的音频文件(我只用.wav 文件进行了测试),那么它就会播放它。完成后,播放器停止。

    请记住,这不会进行任何错误检查或任何操作,因此如果您选择了 .jpeg 文件,例如,它将引发异常。您应该使用这些东西来尝试看看如何精简您的播放器。

    您应该尝试理解的一件事是,这一切都非常简单。文件名只是一个String,没有什么特别复杂的。

    您可以在此处找到Minim 的教程:http://artandtech.aalto.fi/wp-content/uploads/2012/06/minim.pdf

    更新:正弦波与所选歌曲配合使用

    我已经更新了我在此处提供的代码,以处理您正在进行的波操作。我在选择文件时添加了一个boolean true。现在您将不得不调整此代码以处理多个文件。这只是一个例子。

    更新 2:实现了与您的歌曲类一起使用的代码

    import ddf.minim.spi.*;
    import ddf.minim.signals.*;
    import ddf.minim.*;
    import ddf.minim.analysis.*;
    import ddf.minim.ugens.*;
    import ddf.minim.effects.*;
    
    float buttonX;
    float buttonY;
    float buttonW;
    float buttonH;
    
    Minim minim;
    AudioPlayer player;
    ArrayList<Songs> s;
    int k;
    
    String filename;
    
    boolean isSelected = false;
    
    void setup() {
    
      s = new ArrayList();
    
      textSize(24);
    
      frame.setResizable(false);
    
      background(255);
    
      size(600, 600);
    
      fill(0);
      stroke(0);
      noFill();
    
      buttonW = 200;
      buttonH = 50;
      buttonX = width - width/2 - buttonW/2;
      buttonY = height/2 - buttonH/2;
    
      // Minim stuff
      minim = new Minim(this);
    }
    
    void draw() {
    
      background(255);
      fill(0);
    
      rectMode(CORNER);
    
      rect(buttonX, buttonY, buttonW, buttonH);
    
      fill(255);
    
      textAlign(LEFT);
      text("Import File", buttonX+35, buttonY+30);
    
      if (isSelected) {
        s.get(k).waveform();
      }
    }
    
    void mouseClicked() {
      if (mouseX>buttonX && mouseX < buttonX+buttonW && mouseY > buttonY && mouseY < buttonY+buttonH) {
        selectInput("Import music file", "fileSelected");
      }
    }
    
    /* Taken from Processing.org */
    void fileSelected(File selection) {
      if (selection == null) {
        println("Window was closed or user hit cancel");
      } 
      else {
        filename = selection.getAbsolutePath();
        s.add(new Songs(player, filename, "Filename"));
        isSelected = true;
      }
    }
    
    // stop minim and the player.
    void stop() {
      player.close();
      minim.stop();
      super.stop();
    }
    
    class Songs {
      AudioPlayer song; 
      String directory;
      String songName;
      Songs(AudioPlayer song, String directory, String songName) {
    
        song=minim.loadFile(directory);    
    
        this.song=song;
        this.songName=songName;
        song.play();
      }
      void waveform() {
        for (int j = 1; j < song.bufferSize() - 1; j++)
        {
          if (j>0) {
    
            line(j, 214  + song.left.get(j)*50, j+1, 214 + song.left.get(j+1)*50);
            //waves from the left.
            stroke( 255, 0, 0 );  //this is the colour of the first line (red)
            line(j, 214 + song.right.get(j)*50, j+1, 214 + song.right.get(j+1)*50);
            //waves from the right.
            stroke(255, 255, 0);
          }
        }
      }
    }
    

    您看到一闪而过的红光,然后什么都没有,因为它会读取 waveform() 方法并非常快地通过 for 循环,然后继续执行其余部分播放歌曲等操作。像我做的那样把它放在draw() 可以帮助你避免这种情况。

    【讨论】:

    • @user3423784 查看此答案,如果您需要任何帮助,请告诉我。
    • 为此,我已经让导入工作了,但我现在唯一的问题是,当我播放导入的歌曲时,我制作的声波无法与导入的歌曲一起播放,我很累尽可能多地定义它。
    • @user3423784 我不明白你的意思。什么声波?您是否要同时播放两首歌曲?
    • 你知道windows media player之类的音乐播放器在播放歌曲时是如何产生这些动画的吗?就像波浪一样...这是我在播放器中添加的内容。下面是它们的样子:kungfupunk.com/wp-content/uploads/2009/06/… wave 将适用于我的数组列表中的歌曲,但不适用于我从导入按钮获得的歌曲。
    • @user3423784 好的。为什么不将导入的歌曲添加到您的 ArrayList 中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多