首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android中的虚拟合成器(基于jar) -本地jni?

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

Stack Overflow用户
提问于 2019-12-31 18:49:53
回答 1查看 718关注 0票数 6

我试图在Android中加载和使用java的虚拟(软)合成器。我读过Gervill jar将用于此。其他构建块是javax声音的,它作为aar文件出现在我的项目中(因为它不存在于修整的Android的Java包中)。

分级文件包含如下:

代码语言:javascript
复制
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

代码语言:javascript
复制
MidiSystem.getMidiDeviceInfo().size    //results in an empty array in all cases

一些答案表明,只包含沙尔维尔罐是足够的自动检测。但既然这对我没用,我就写了这个

代码2

代码语言:javascript
复制
var synth = SoftSynthesizer() as Synthesizer
        MidiSystem.addSynthesizer(synth)

我得到了这个编译错误

代码语言:javascript
复制
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

代码语言:javascript
复制
var synth = MidiSystem.getSynthesizer()
synth?.open()

如上面所示,包含到gradle,这是在没有代码2的情况下的运行时错误。

代码语言:javascript
复制
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文件

但是,在模块依赖级中没有相互链接(应该/如何这样做?)虽然沙维尔需要javax.sound

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

编辑

1查明问题。Gervill.jar不够好,不能避免错误。因此,我从com.sun.media.声.*中挑选了几个其他类,并编译成新的jar。现在,代码2 (unresolved supertypes)中的错误已经消失。

下一次试验将包括Android midi服务。

代码语言:javascript
复制
val midiManager = context.getSystemService(Context.MIDI_SERVICE) as android.media.midi.MidiManager
midiManager.getDevices()

这提供了2项服务,具体取决于安装在移动设备上的外部应用程序。但无论如何,它们并不与软合成器相连。3.

因此,代码1仍然有用于MidiDeviceInfo的空数组。3.

代码3的一部分:synth?.open()仍然失败严重,但是出现了新的错误。(目前困在这里)

代码语言:javascript
复制
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:

代码语言:javascript
复制
jp.kshoji.javax.sound.midi.MidiSystem.getSoundbank(File("soundfont.sf2"))

失败与

代码语言:javascript
复制
Caused by: java.lang.UnsupportedOperationException: not implemented.
    at jp.kshoji.javax.sound.midi.MidiSystem.getSoundbank(MidiSystem.java:277)

我已经检查了Java的windows版本源代码。没有要使用getSoundbank的文件的重写或实现。

修复和未来的步骤?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-17 17:37:09

我理解的解决办法

代码3。

github.com/KyoSherlock/MidiDriver是android,它的内容与com.sun.media.sound &jp\javax\声\midi放在一起的内容相同。还修剪以排除不想要的类。

其他的midi司机

是基于本机C/C++代码的,我一直避免使用这种代码。

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

代码4。

调用加载声音库应该通过SF2SoundBank,而不是通过MidiSystem.getSoundbank(soundFontFile)

代码语言:javascript
复制
val sf = SF2Soundbank(assets.open("SmallTimGM6mb.sf2"))

代码1。

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

在这里可以进行深度阅读,midi.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59547587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档