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)

总结

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

相关推荐
Devil枫28 分钟前
Kotlin高级特性深度解析
android·开发语言·kotlin
ChinaDragonDreamer29 分钟前
Kotlin:2.1.20 的新特性
android·开发语言·kotlin
雨白11 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹13 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空14 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭15 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日16 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安16 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑16 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟20 小时前
CTF Web的数组巧用
android