Android中的虚拟合成器(基于jar)-本机jni?

问题描述 投票:7回答:1

我正在尝试在Android中加载和使用Java的虚拟(软)合成器。我读过Gervill jar将用于此目的。其他构建块是javax-sound作为aar文件存在于我的项目中(因为它在Android的修剪过的Java包中不存在)

Gradle文件包含为

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.0"
    dataBinding {
        enabled = true
    }
    defaultConfig {
        applicationId "com.mmm.ttt"
        minSdkVersion 18
        targetSdkVersion 29
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation project(path: ':javax-sound')
    implementation project(path: ':gervilljar')         // This is folder name at project root folder level containing gervill.jar
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:multidex:1.0.3'
}

代码问题区域

代码1

MidiSystem.getMidiDeviceInfo().size    //results in an empty array in all cases

某些答案表明,仅包含gervill jar足以进行自动检测。但是由于那对我没有用,所以我写了这个

代码2

var synth = SoftSynthesizer() as Synthesizer
        MidiSystem.addSynthesizer(synth)

我为此得到编译错误

Supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
    class com.sun.media.sound.SoftSynthesizer, unresolved supertypes: com.sun.media.sound.ReferenceCountingDevice
    class com.sun.media.sound.AudioSynthesizer, unresolved supertypes: javax.sound.midi.Synthesizer 

代码3

var synth = MidiSystem.getSynthesizer()
synth?.open()

[包含以上所述的内容,这是缺少代码2时的运行时错误

Caused by: jp.kshoji.javax.sound.midi.MidiUnavailableException: Synthesizer not found
        at jp.kshoji.javax.sound.midi.MidiSystem.getSynthesizer(MidiSystem.java:323)

[我跟随https://stackoverflow.com/a/38749847/1029110添加了aar / jar文件但是,尽管gervill需要javax.sound

,但还没有在模块依赖项gradle中相互链接(应该/如何做?)

最终目的是加载和播放声音字体文件。尽可能避免使用本机jni代码。

编辑

1个已确定的问题。 Gervill.jar不够好,无法正常工作。因此,我从com.sun.media.sound。*中选择了其他几个类,并将其编译到新的jar中。现在,代码2(unresolved supertypes)中的错误已消失。

下一次试用将包括Android midi服务

val midiManager = context.getSystemService(Context.MIDI_SERVICE) as android.media.midi.MidiManager
midiManager.getDevices()

这提供了2种服务,具体取决于移动设备上安装的外部应用程序。但是它们无论如何都不与软合成器链接。因此,代码1仍然有MidiDeviceInfo的空数组。代码3的一部分:synth?.open()仍然严重失败,但是出现了新的错误。((目前卡在这里)

Caused by: jp.kshoji.javax.sound.midi.MidiUnavailableException: Can not open line
        at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1132)
        at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1036)
Caused by: java.lang.IllegalArgumentException: No line matching interface jp.kshoji.SourceDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian is supported.
        at jp.kshoji.javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:475)
        at jp.kshoji.javax.sound.sampled.AudioSystem.getSourceDataLine(AudioSystem.java:602)
        at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1066)
        at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1036) 

代码4:

jp.kshoji.javax.sound.midi.MidiSystem.getSoundbank(File("soundfont.sf2"))

失败

Caused by: java.lang.UnsupportedOperationException: not implemented.
    at jp.kshoji.javax.sound.midi.MidiSystem.getSoundbank(MidiSystem.java:277)

我已经检查了Java for Windows版本的源代码。没有使用getSoundbank的文件替代或实现。

修正和以后的步骤?

android audio java-native-interface midi javax.sound.midi
1个回答
0
投票

我所理解的解决方案

代码3。

github.com/KyoSherlock/MidiDriver是android ready代码,具有与com.sun.media.sound和jp \ kshoji \ javax \ sound \ midi相同的内容。还进行了修剪以排除不需要的类。

[其他Midi驱动程序,例如

基于本机C / C ++代码,我一直都避免。

此答案帮助了https://stackoverflow.com/a/56700883/1029110

代码4]。>

加载声库的呼叫应通过SF2SoundBank而不是通过MidiSystem.getSoundbank(soundFontFile)完成

val sf = SF2Soundbank(assets.open("SmallTimGM6mb.sf2"))

代码1。

对于通过电话扬声器产生声音可能并不重要,因为即使KyoSherlock运行样本也返回0

可以在这里进行深度阅读http://jsresources.sourceforge.net/faq_midi.html

热门问题
推荐问题
最新问题