2

如何使用 libpd 在 Android 中播放波形文件?我可以用 来做到这一点soundpool.play,但我想试试 libpd。我按照本教程实现了 libpd,但它不起作用。有什么问题?代码还是 PD 补丁?

这是我的活动代码:

public class MainActivity extends ActionBarActivity implements OnTouchListener {

    private PdUiDispatcher dispatcher;

    private void initPD() throws IOException {
        int sampleRate = AudioParameters.suggestSampleRate();
        PdAudio.initAudio(sampleRate, 0, 2, 8, true);

        dispatcher = new PdUiDispatcher();
        PdBase.setReceiver(dispatcher);
    }

    private void loadPDPatch() throws IOException {
        File dir = getFilesDir();
        IoUtils.extractZipResource(getResources().openRawResource(R.raw.playaudio), dir, true);
        File pdPatch = new File(dir, "playaudio.pd");
        PdBase.openPatch(pdPatch.getAbsolutePath());
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bangButton = (Button) findViewById(R.id.bangButton);
        bangButton.setOnTouchListener(this);

        try {
            initPD();
            loadPDPatch();
            PdAudio.startAudio(this);

        } catch (IOException e) {
            finish();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        PdAudio.startAudio(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        PdAudio.stopAudio();
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN)
            if(v.getId() == R.id.bangButton) {
                PdBase.sendBang("mybang");
            }

        return false;
    }
}

这是我的 pd 补丁:

纯数据补丁

#N canvas 0 22 902 577 24;
#X obj 46 24 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1
;
#X obj 47 248 dac~;
#X obj 48 193 readsf~;
#X obj 49 118 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
-1;
#X msg 42 61 \; pd dsp \$1;
#X msg 50 155 open myfile.wav \, 1;
#X connect 0 0 4 0;
#X connect 2 0 1 0;
#X connect 3 0 5 0;
#X connect 5 0 2 0;
4

3 回答 3

1

错误在 Pd 补丁中:

mybang您正在向Pd 补丁中的符号发送一声巨响。

但是,补丁中似乎没有附加到该名称的接收器,因此即使在 Pd 中也不会触发任何内容。

  • 您还有另一个[send mybang]bng对象触发(但这也只会发送到 void)。

  • [bng]对象可能有一个接收标签集,但是

    • 根据屏幕截图,它根本没有设置接收标签(如果是这样,入口就会消失;但它有点难以阅读)。

    • 如果你确实有一个 receive-label mybang,那么点击[bng]会触发一个无限递归([bng]=> [s mybang]-> [bng]...)

一般错误

输出[bng]:你永远不应该有消息的扇出(你将一个出口连接到多个消息入口),因为这会导致执行顺序不确定;[trigger]在这些情况下使用。

last outlet of [readsf~]:默认[readsf~]单声道播放器;该对象的最后一个出口会bang在声音文件播放完毕时为您提供一个;将 a 发送bang到(期望信号)的第二个入口[dac~]是一个错误。如果您想要立体声文件播放器,请使用[readsf~ 2]

解决方案

所以补丁应该看起来像:

[bng]
|
[s mybang]

[r mybang]
|
[open myfile.wav, 1(
|
[readsf~ 2]
|     |
[dac~ ]
于 2015-08-26T10:25:39.040 回答
0

在集成到 android 之前,单独的补丁是否有效?如果是这样,请尝试使用另一个按钮通过 android 启用 DSP ON,并将其发送到永久修补或删除 DSP ON 切换框并使 DSP ON。

于 2015-08-23T21:07:20.043 回答
0

在 Peter Brinkmann 的“制作音乐应用程序”一书中

他建议:

“如果您的补丁使用额外的资源,例如 wav 文件或抽象,那么最好将这些资源与您的补丁一起打包并仅通过相对路径引用它们。”

换句话说:将所有文件夹内容压缩到一个 zip 文件中,因此在 Android 中解压缩时,所有资源都将位于同一文件夹中,pd 补丁将能够找到您的 .wav 或其他文件。

于 2016-02-18T20:52:46.810 回答