原文链接:Onset Detection Part 2: A simple framework

好了,我刚刚为我们的起始点检测入门教程组合了一个简单的框架。它位于 http://code.google.com/p/audio-analysis/ 。要获得代码,你将需要一个SVN客户端,在Windows平台上Tortoise SVN 是相当好的,使用linux平台的人应该知道自己该怎么办 :)。只需从 svn URL http://audio-analysis.googlecode.com/svn/trunk/ 检出该项目,并将其导入Eclipse。现在您已经准备好了,让我们来看看这个“框架”里面都有什么。

第一个类叫作AudioDevice。看起来是这样的

public class AudioDevice
{public AudioDevice( );public void writeSamples( float[] samples );
}

很简单,不是吗?这将在44100Hz单声道模式下设置一个到主声卡的连接。只需调用构造函数。如果它不能安装(setup)硬件,它将抛出一个异常,但“这绝不应该发生”(TM)。要将PCM数据输出到音频设备,请调用 AudioDevice.writeSamples 并传入你的包含 44100Hz 单声道 PCM样本的浮点数组。

我写了一个小例子,它将产生一个440Hz的正弦波,并输出到音频设备。它是这样的:

public class NoteGenerator
{public static void main( String[] argv ) throws Exception{final float frequency = 880; // 440Hz for note Afloat increment = (float)(2*Math.PI) * frequency / 44100; // angular increment for each samplefloat angle = 0;AudioDevice device = new AudioDevice( );float samples[] = new float[1024];while( true ){for( int i = 0; i < samples.length; i++ ){samples[i] = (float)Math.sin( angle );angle += increment;}device.writeSamples( samples );}}
}

它基本上是本系列第1部分中代码片段的重写版本。在每个循环迭代中,我们生成下一个1024个正弦波样本,并将其提供给音频设备。稍微修改一下这段代码,比如改变正弦波的频率。例如,如果你把频率加倍,你可以得到高八度的同一个音符。反之亦然。要停止程序,您必须在Eclipse中单击stop按钮来终止它。一个合适的GUI对于这样简单的例子来说有点多余。您可以在 com.badlogic.audio.samples 包中找到源代码。

我提供给您的第二个类是一个Wave文件解码器。使用这个类,您可以读取16位单声道/立体声的Wave文件,采样率为44100Hz。该解码器支持其他一些格式/采样率,但是为了简单起见,我只支持上面提到的配置。实现所有这些功能的类称为 WaveDecoder 。它将把PCM数据从Wave文件转换为flie上的32位浮点采样样本。以下是该类的签名:

public class WaveDecoder
{ public WaveDecoder( InputStream stream ) throws Exception;public int readSamples( float[] samples );
}

又相当简单。在构造函数中,您传递InputStream,从那里读取Wave文件。如果发生错误,将抛出异常。正确实例化该类之后,可以通过调用 WaveDecoder.readSamples()Wave文件中读取采样样本。该方法将尝试从Wave文件中读取与传入的samples数组中的元素个数相同的样本。它将返回实际读取的样本数量。如果Wave文件是立体声的,则立体声样本将被均值处理为本系列第1部分中解释的单声道样本。如果方法返回0,您就知道已经到达流的末尾,或者发生了错误。下面是一个简单的例子,如何使用波解码器结合音频设备入从一个Wave文件输出声音:

public class WaveOutput
{public static void main( String[] argv ) throws Exception{AudioDevice device = new AudioDevice( );WaveDecoder decoder = new WaveDecoder( new FileInputStream( "samples/sample.wav" ) );float[] samples = new float[1024];while( decoder.readSamples( samples ) > 0 )device.writeSamples( samples );}
}

我们首先构造音频设备和波解码器,以及一个浮点数组,其中包含从Wave文件中读取的样本。在每个循环迭代中,我们尝试读取1024个样本(样本数组的长度)并将这些样本写入音频设备。就是这样。声音编程真的很简单。示例的代码可以在包 com.badlogic.audio.samples 中找到。接下来你就可以开始,盘它。例如,您可以改变采样的振幅,例如,在将每个采样写入音频设备之前,将每个采样的响度乘以0.5,从而将响度减半。

我将向这个项目添加一些helper类,以可视化我们在本系列中处理/生成的数据。我们还将通过一些漂亮的分析类来扩展这个项目,这些类将允许我们进行适当的节拍检测(can you say Fast Fourier Transform?(快速傅里叶变换))你会很惊奇它是多么容易做简单的节拍检测?。

结束。

音符起始点检测(音频节奏检测)(2)相关推荐

  1. 音符起始点检测(音频节奏检测)(1)

    原文链接:Onset Detection Part 1: The Basics 在这篇文章中,我想开始一个小的循序渐进的系列,它将允许您为您的音乐游戏需求构建自己的起始点检测器(onset detec ...

  2. 音频节奏检测(Onset Detection)

    项目代码下载 https://download.csdn.net/download/weixin_43865690/39129840 1. 前言 最近市场上出现一些多个视频拼接而成MV,其原理是根据音 ...

  3. 音符起始点检测(音频节奏检测)(6)

    原文链接:Onset Detection Part 6: Onsets & Spectral Flux 在之前的一篇文章中,我从科学的角度讨论了起点/节拍检测.有很多不同的方案可以不同程度的做 ...

  4. 音符起始点检测(音频节奏检测)(4.5)

    原文链接:Onset Detection Part 4.5: What to expect (这篇文章没大翻译明白,建议阅读原文.大概内容就是在展示自制检测器对各种类型音乐的检测效果,以及和 audi ...

  5. 音符起始点检测(音频节奏检测)(5)

    原文链接:Onset Detection Part 5: The (Discrete) Fourier Transform 警告:这是我理解离散傅里叶变换的方法,在一些地方可能是错误的.对于傅里叶变换 ...

  6. 音符起始点检测(音频节奏检测)(7)

    原文链接:Onset Detection Part 7: Thresholding & Peak picking 在上一篇文章中,我们看到了如何将一个随着时间的推移而演化为一个简单一维函数的复 ...

  7. python 声音强度检测_python检测音频中的静音

    #-*- coding: utf-8 -*- importosimportwavefrom time importsleepimportnumpy as np SUCCESS=0 FAIL= 1 #需 ...

  8. 音频算法检测发言者方位

    音频算法检测发言者方位:

  9. java mp3静音检测,音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

最新文章

  1. python的turtle绘图体系入门必看(一)
  2. 最短路径—Dijkstra算法和Floyd算法
  3. error C2039: IsOutRange
  4. python五十三:组合的方式完成授权
  5. Java中三种Set的实现类的用法和区别
  6. linux 全双工 wifi热点,Linux中的同时套接字读/写(“全双工”)(特别是aio)
  7. php网站点击按钮更新程序,php页面 点击按钮执行更新操作
  8. ubuntu 如何用root身份进行登录
  9. robot连PCwifi、PC开Shell连robot
  10. python后端开发书籍_后端书籍推荐
  11. Centos 6.5 服务器下面配置邮件客户端 发送报警邮件
  12. java applog_个人app如何收集用户日志
  13. 高项、高级项目管理师论文-整体管理
  14. java分支讵_Java实现简体字向繁体字的转换
  15. 中学计算机课小课题,信息技术小课题研究题目大全
  16. 虚拟机ping通主机步骤_6在购买虚拟主机服务之前,请按照操作步骤进行操作
  17. Django models模块字段注释
  18. 上取整与下取整的解析
  19. TextView Recyclerview省略号相关
  20. 百度智能云 API鉴权总结

热门文章

  1. Hdu1914稳定婚姻匹配
  2. 实践两年多的新零售,谁会掉队,谁会脱颖而出?
  3. Pyhton精讲day11--综合案例三国人物出场频次分析
  4. 计算机常用英语1000个,1000个最常用英语单词以及翻译
  5. soc eds能 编译linux,在SoCEDS环境下编译和更新preloader和uboot程序的方法
  6. SunGard Global trading Presentation
  7. unturned组服务器网站,Unturned
  8. 微软网站打开慢怎么办_为什么你的Python包老是装不上?收下这个网站就对了
  9. java读取桌面文件_用java读取桌面上的文档abc.txt,程序怎么写?
  10. ESXI6.7打补丁升级至17700523版本