在Processing中的类中实例化SoundFile对象

时间:2015-06-17 05:08:17

标签: audio processing

我正在尝试在Processing(最新版本,3.0a10)中的另一个类中创建SoundFile类型的实例。我可以轻松播放在课堂外定义的声音,如下所示:

$form = $('#signupFrm'); // cache
$form.find('a.submit img').prop('disabled', true); // disable submit btn

但是,当我尝试从类中创建一个SoundFile实例时,我遇到了麻烦。一个简单的例子是:

import processing.sound.*;

SoundFile clickSound;

void setup() {
  size(600, 600);
  clickSound = new SoundFile(this, "bike-passing-by.wav");
}

void draw() {
  clickSound.play();
}

我收到的错误是import processing.sound.*; SomeSound fx; void setup() { size(600, 600); fx = new SomeSound(); } void draw() { fx.play(); } class SomeSound { SoundFile clickSound; SomeSound() { clickSound = new SoundFile(this, "bike-passing-by.wav"); } void play() { clickSound.play(); } } 。在SoundFile的Processing参考中,它声明构造函数定义为"The constructor SoundFile(soundTest.SomeSound, String) is undefined"。 parent参数应该是SoundFile(parent, path)

因此我尝试了许多选项来替换这一行: PApplet: typically use "this"

我尝试用clickSound = new SoundFile(this, "bike-passing-by.wav");替换thissuper

clickSound = new SoundFile(super, "bike-passing-by.wav");PApplet

但只能设法产生不同的错误。任何关于如何解决这个问题的建议将不胜感激。

2 个答案:

答案 0 :(得分:3)

发生错误的原因是,正如您所说,您需要访问在Processing sketch中自动为您创建的PApplet实例。当您在另一个班级时,this关键字引用该班级的实例,而不是草图的PApplet实例。

如果您的课程在主草图内(而不是在另一个标签中),那么您可以这样做:

import processing.sound.*;

SomeSound fx;

void setup() {
  size(600, 600);
  fx = new SomeSound();
}

void draw() {
  fx.play();
}

class SomeSound {
  SoundFile clickSound;

  SomeSound() {
    clickSound = new SoundFile(NameOfYourSketch.this, "bike-passing-by.wav");
  }

  void play() {
    clickSound.play();
  }

}

你唯一真正关心的是这一行:

clickSound = new SoundFile(NameOfYourSketch.this, "bike-passing-by.wav");

此语法可能看起来很奇怪,但您可以使用this转到草图级NameOfYourSketch.this。在引擎盖下,这是因为您的草图被编译成Java类,主草图窗口中的类是该类的非静态内部类。

如果您的类在另一个选项卡中,那么该方法将不起作用,因为它们自己的选项卡中的类被编译到它们自己的顶级非内部Java类中,因此它们无法访问草图级别this变量。相反,你必须把它传递给班级:

import processing.sound.*;

SomeSound fx;

void setup() {
  size(600, 600);
  fx = new SomeSound(this);
}

void draw() {
  fx.play();
}

class SomeSound {
  SoundFile clickSound;

  SomeSound(PApplet p) {
    clickSound = new SoundFile(p, "bike-passing-by.wav");
  }

  void play() {
    clickSound.play();
  }

}

请注意SomeSound构造函数接受PApplet参数,然后可以将其传递给SoundFile构造函数。要将PApplet实例提供给SomeSound构造函数,您可以使用草图级this关键字。

请注意,如果您的类在其自己的选项卡中定义,或者如果它位于草图选项卡内,并且它与草图“耦合”一点,则第二种方法将起作用,因此它可能优于第一种方法。

答案 1 :(得分:-1)

import processing.sound.*;

class callerClass{
  SomeSound fx;

  void setup() {
    size(600, 600);
    this.fx = new SomeSound();
  }

  void draw() {
    this.fx.play();
  }
}
class SomeSound {
  SoundFile clickSound;

  SomeSound() {
    clickSound = new SoundFile(this, "bike-passing-by.wav");
  }

  void play() {
    clickSound.play();
  }

}
  • 在此方法中,实例fx不会被破坏,因此如果任何问题必须发表评论,请尝试使用此方法。