Android 调音器开发

什么是调音器?

是一种乐器的辅助工具,用于各种弦乐器的调音,包括吉他调音器,贝斯调音器,钢琴调音器,古筝调音器,尤克里里调音器等。可根据乐音的频率判断所处的音符,从而校准改弦是否需要拧紧或者放松。

TarsosDSP接入

TarsosDSP是一个用Java编写的开源音频处理库,旨在提供音频分析和音频处理的功能。它提供了一组丰富的工具和算法,可用于音频信号的分析、转换和合成。

TarsosDSP的主要功能包括:

  1. 音频录制和播放:可以使用TarsosDSP捕获音频输入并进行实时或离线音频处理。

  2. 音频格式转换:可以将音频文件从一种格式转换为另一种格式,例如从MP3到WAV。

  3. 音频特征提取:可以提取音频信号的各种特征,如频谱、光谱包络、音高、节拍等。

  4. 音频滤波器:提供了各种滤波器,如低通、高通、带通和带阻滤波器,可用于音频信号的频率调整和去噪等任务。

  5. 音频合成:可以使用合成算法生成音频信号,如合成特定频率的波形信号或合成复杂的音乐音轨。

  6. 音频分析和处理:提供了一系列算法和工具,如FFT变换、MFCC(Mel频率倒谱系数)提取、音高估计、音频匹配等,用于音频信号的分析和处理。

TarsosDSP具有易于使用的API,使开发人员能够在自己的Java应用程序中轻松集成音频处理功能。它适用于各种应用领域,包括音频分析、音乐信息检索、音频特征提取、音频处理和合成等。

准备开发

了解了TarsosDSP的功能后,我们就可以去GitHub上找到并下载该库的最新包

地址(https://0110.be/releases/TarsosDSP/),下载完成后,将jar包依赖至我们的项目中

获取频率

音频分析需要录音的功能,在申请得到录音权限后,就可以通过TarsosDSP获取我们所需要的音频了

java 复制代码
    private static final int SAMPLE_RATE = 44100;//采样率
    private static final int BUFFER_SIZE = 4096;//每一次采样大小
    private static final int OVERLAP = 768 * 4;//重叠
    private void startAnalysis() {
        AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(SAMPLE_RATE, BUFFER_SIZE, OVERLAP);
        PitchDetectionHandler pdh = new PitchDetectionHandler() {
            @Override
            public void handlePitch(PitchDetectionResult pitchDetectionResult, AudioEvent audioEvent) {
                float pitch = pitchDetectionResult.getPitch();//获的频率
                if (pitch != -1) {
                    Log.e("TAG", "handlePitch: " + pitch);
                }

            }
        };
        AudioProcessor p = new PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.YIN, SAMPLE_RATE, BUFFER_SIZE, pdh);
        dispatcher.addAudioProcessor(p);
        Thread audioThread = new Thread(dispatcher, "Audio Dispatcher");
        audioThread.start();
    }

音频分析

根据TarsosDSP返回的频率,结合音程与频率的参考数据表,就可以得到当前弦所处的音符信息

音频有效的最大最小范围计算

举例几个音符的准确频率:

|----|--------|
| D# | 155.56 |
| E | 164.81 |
| F | 174.61 |

即"E"音符的最小和最大频率有效范围为:

   min = 164.81 - (164.81-155.56) / 2

   max = 164.81 + (174.61-164.81) / 2

音频准确的最大最小范围计算

"E"音符的最小和最大的准确范围为:

  minAccuracy = 164.81 - (164.81-min) / 2 * 0.1    

  maxAccuracy = 164.81 + (max-164.81) / 2 * 0.4

//0.1和0.4代表着最小和最大的准确范围计算公式

音分计算

private double accuracy = 164.81; //准确频率
private double cc = 166.00; //当前得到的频率
private static double rate = 1.0005778; //音分倍率
double cent = Math.log(accuracy / cc) / Math.log(rate); //cent为音分值(-12.4)

总结

根据得到的频率,再参考准确值的音符数据表,可得出当前处于哪个音符的有效值范围,调音器页面就可以提示用户需要拧紧或者放松,若当前频率处于准确的最大和最小范围中,即为准确音符。如需要音符的参考数据表格,欢迎评论区找我

相关推荐
openinstall全渠道统计3 小时前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
双鱼大猫3 小时前
一句话说透Android里面的ServiceManager的注册服务
android
双鱼大猫3 小时前
一句话说透Android里面的查找服务
android
双鱼大猫3 小时前
一句话说透Android里面的SystemServer进程的作用
android
双鱼大猫3 小时前
一句话说透Android里面的View的绘制流程和实现原理
android
双鱼大猫4 小时前
一句话说透Android里面的Window的内部机制
android
双鱼大猫5 小时前
一句话说透Android里面的为什么要设计Window?
android
双鱼大猫5 小时前
一句话说透Android里面的主线程创建时机,frameworks层面分析
android
苏金标5 小时前
android 快速定位当前页面
android
雾里看山8 小时前
【MySQL】内置函数
android·数据库·mysql