【问题标题】:How to program a simple music sequencer for Android (Java) [closed]如何为Android(Java)编写一个简单的音乐音序器[关闭]
【发布时间】:2011-10-19 15:17:11
【问题描述】:

我想做的事:

我想为 Android 编写一个非常简单的音乐音序器。但我从未分别在 Android 或 Java 上使用过音频。

应用程序应该做什么:

  • 播放样本(WAVE/OGG 文件)
  • 同时播放多个音频通道(例如,小号和长笛应同时播放,最多 10 种乐器)
  • 更改样本的音高(例如,小号 WAVE 文件必须以正常音高 (c4) 和低/高音高 (e2/g6) 等播放)

这是应用程序通常应该能够执行的操作。

我需要哪些组件?普通的媒体播放器(AudioManager?)不会工作,对吧?

已经有一些应用程序可以满足我的想法:

  • iOS 版手指节拍
  • FL Studio Mobile for iOS
  • Uloops Studio for Android

提前感谢您的帮助!

【问题讨论】:

    标签: java android audio


    【解决方案1】:

    有一个非常简单的 Android 开源节拍音序器,名为 SoundFuse。他们在页面上有描述和屏幕截图。

    Here 是 github 存储库。

    【讨论】:

    • 非常感谢,这个项目很有趣,我觉得可以帮到我很多:)
    【解决方案2】:

    你的要求不是一个简单的,而是三个截然不同的要求。

    1. 在 javax.sound.sampled 中的类的帮助下,JRE 应该支持开箱即用地播放 WAV,它只是需要一些代码来连接它(不太确定 android)。

    2. 开箱即用不支持播放 OGG。 OGG 有一个名为 jOrbis 的开源实现,请参阅他们的web site。同样,这可能需要一些接线代码才能连接到您的应用程序中。

    3. 对于音序器,您可以只使用 MIDI。 JRE 应该再次支持它,如果它不在您的平台上,您可以使用 Gervill - 一个纯 Java MIDI 音序器 (Project web site)。

    4. 还有一个 ModPlayer 可以播放不错的旧 Soundtracker 和其他一些。如果您知道 Soundtracker 或 Screamtracker 模块格式(古老的格式,但网络上仍有描述),这也可能被用作某种音序器。有源码的播放器可以找到here。顺便说一句,Tracker 格式并不是那么古老,今天的一些游戏引擎仍在使用它们。

    5. 如果你真的想要,你可以制作你自己的 Sequencer,如果 javax.sound.sampled 中有所有基本的东西的话。它只需要一些关于数字声音的基本知识和大量的接线代码。

    所有您的需求没有单一的解决方案,您必须从免费提供的构建块中将您拥有的东西拼接在一起。

    【讨论】:

    【解决方案3】:

    我无法提供完整的答案,但我会为您指明正确的方向。

    Android 确实支持 .wav 和 .ogg 解码。根据:http://developer.android.com/guide/appendix/media-formats.html

    我没有任何音频方面的经验,但您最好的选择似乎是 SoundPool 类,它允许您调整音高和音量,并且似乎能够同时播放多个声音:“请注意,调用 play( ) 如果超过活动流的最大数量,可能会导致另一个声音停止播放。” http://developer.android.com/reference/android/media/SoundPool.html

    还有一个 MediaPlayer 类,但这是为了更简单的使用。我认为它不允许音高控制。

    【讨论】:

    • 非常感谢您,Boude,您终于说服我使用 SoundPool 类 :)
    【解决方案4】:

    我为我的应用程序制作了类似的东西(演奏长号示例)。经过大量的体验,我发现最好的解决方案是使用 AudioTrack。 看看我的源代码: http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino

    特别是

    http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino/Trombone.java http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino/WavFile.java

    【讨论】:

    • 谢谢,我会看看你的代码,我相信它可以帮助我。您能解释一下为什么不使用 SoundPool 吗?对我来说,这门课似乎是最合适的。
    • 我的第一个版本使用 soundpool。但是使用 soundpool 循环会在每个循环之间产生令人讨厌的“点击”(至少在我的愿望和一些用户报告的情况下),这对于音乐样本是不可接受的。
    • 另外,使用音轨,您可以在声音文件中循环播放,而不是循环播放整个文件(更适合采样)。据我所知,我也很快遇到了 soundpool 的内存问题,而且样本很少。
    【解决方案5】:

    您将在 Android 系统上遇到计时问题。为避免您的定序器线程被垃圾收集中断,您可能需要使用 ndk 在本机中编写定序器。

    播放声音可能最好也使用 ndk。

    看看https://code.google.com/p/high-performance-audio/

    在上面的 Soundfuse 示例中,音序器使用 SystemClock.sleep(),这绝不是一个好主意。检查Why using System.Threading.Thread.Sleep() is a bad practice?

    意识到这个问题确实很老,但无论如何都会回答,因为没有答案提到 NDK。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 2012-04-06
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多