将wav音频文件频谱分析后映射到钢琴琴键上(类似audio to midi功能)

 

 

import wave
import numpy
from pyaudio import PyAudio
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
import mathwf = wave.open('e:/tests/audio2miditest.wav', 'rb')
# 创建PyAudio对象
p = PyAudio()
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),channels = wf.getnchannels(),rate = wf.getframerate(),output = True)
nframes = wf.getnframes()
print("nframes",nframes)
framerate = wf.getframerate()# 读取完整的帧数据到str_data中,这是一个string类型的数据
str_data = wf.readframes(nframes)
wf.close()# 将波形数据转换成数组
wave_data = numpy.fromstring(str_data, dtype=numpy.short)
# 将wave_data数组改为2列,行数自动匹配
wave_data.shape = -1,2
# 将数组转置
wave_data = wave_data.T
print("wave_data shape",wave_data.shape)#读取片段数
nsegments=int(wave_data.shape[1]/framerate)
print("nsegments",nsegments)def freqs():# 采样点数,修改采样点数和起始位置进行不同位置和长度的音频波形分析N = 44100df = framerate/(N-1)  # 分辨率freq = [df*n for n in range(0, N)]  # N个元素print("freq",freq)#片段频率数组seg_freqs=[]#钢琴键序号组key_nums=[]for i in range(nsegments):start = i*N  # 开始采样位置end=start+N        wave_data2 = wave_data[0][start:end]c = numpy.fft.fft(wave_data2)*2/N# 常规显示采样频率一半的频谱d = int(len(c)/2)# 仅显示频率在4000以下的频谱while freq[d] > 4000:d -= 10vf_dict=dict(zip(abs(c[:d-1]),freq[:d-1]))max_v=max(abs(c[:d-1]))max_f=vf_dict[max_v]  seg_freqs.append(max_f)print("max f:v",max_f,max_v)#计算最接近的钢琴键号key_num_nearest=round(math.log(max_f/27.5,1.059))+1key_nums.append(key_num_nearest)print("key_nums",key_nums)#可视化plt.rcParams['font.sans-serif']=['SimHei']plt.figure(figsize=(20,20), dpi=90)xs=range(len(seg_freqs))ys=seg_freqs     #频谱ax1 = plt.subplot(211)ax1.plot(xs, ys,color="blue") ax1.set_title("频率时序谱")ax1.set_xlabel("时间 S")ax1.set_ylabel("时点主频率")xs1=range(len(key_nums))ys1=key_nums#钢琴键谱ax2 = plt.subplot(212)ax2.scatter(xs1, ys1,color="red")    ax2.set_xticks(xs1)ax2.set_yticks(range(min(ys1)-1,max(ys1)+1))ax2.set_title("钢琴键时序谱")ax2.set_xlabel("时间 S")ax2.set_ylabel("时点对应钢琴键序号")ax2.grid()plt.show()def main():freqs()if __name__ == '__main__':main()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58016.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt+MPlayer音乐播放器开发笔记(一):ubuntu上编译MPlayer以及Demo演示

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/118713520 长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808 红胖子(红模仿)的博文大全:…

android音乐播放器频谱图控件

先上效果图: 先通过测量获取view的宽高,然后将宽分为12份,11份为11个条形柱,剩余一份在分为10份作为条形柱之间的间距 Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMe…

Virtual Piano 自动播放乐谱

钢琴按键分布 钢琴 一共88个键,52个白键,36个黑键。 从左到右按音区分,可分为 低音区:不完整的大二字组、大字一组、大字组; 中音区:小字组、小字一组、小字二组; 高音区:小字三…

Qt开发音乐播放器时,频谱显示控件的详细绘制(好思路)

总第46篇 本文详细梳理了在Qt框架制作音乐播放器的过程中,频谱显示的绘制过程。 在开发音乐播放器的时候,需要将音频数据转换成对应的频谱显示,我们可以采用fmod 第三方库来处理,即通过fomd获取音频数据对应的频谱数据,再在项目中对数据进行绘制即可,这样使工程高度解耦,…

用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐

一、前言 QMediaplayer可以用于解析音频文件和视频文件,继承自QMediaObject,涉及到的对象为QMediaContent。QMediaObject可以提供关于媒体内容的接入,通过URL进行初始化,同时也可以提供可以播放的媒体文件的列表,与QM…

基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条

2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.实现音频文件对话框(QFileDialog类)2.实现音乐播放(QMediaPlayer类/QMediaPlaylist类)3.实现进度条更新以及文件…

基于QT的音乐播放器频谱实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、官方文档分析二、实现步骤1. 捕获原始音频数字信号2. 读取音频数据3. 计算FFT4. 项目源码目录5. 实际效果 总结 前言 网上的很多音乐播放器频谱实现&#…

A40i使用笔记:使用QT调用aplay播放wav音频/混音

一、前言 在linux当中播放音乐的方式有很多种,我使用的A40i核心板,是 aplay 指令,是 alsa 的一个指令,也就是说需要先安装有 alsa,使用其他arm开发板的小伙伴可以先自行安装alsa之后在进入正文,这里我没实…

音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)

音频频谱显示-显示音频文件静态频谱图(一) https://blog.csdn.net/xiaolong1126626497/article/details/126971535 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二) https://blog.csdn.net/xiaolong1126626497/article/details/126973994 一、前言 在做音乐播…

QT音乐播放器2:切歌,暂停继续合一

1、实现切歌,循环播放 mainwindow.h private slots:void on_nextBt_clicked();void on_frontBt_clicked();在mainwindow.cpp中 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){//切歌存储歌单列表QFileInfoList infolist …

用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲

一、前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐。 在用Qt写一个简单的音乐播放器(二):增加界面(开始和暂停音…

如何使用Guitar Pro在乐谱播放时切换效果器音色?

如何使用Guitar Pro在乐谱播放时切换效果器音色? 关键词:吉他谱 Guitar Pro是一款专注于多种乐器谱制作和播放的高效电脑系统软件,我们使用它可以完成非常多的乐谱操作,如乐队排练、和弦学习等适用于高手和新手的功能都不在话下…

qt 频谱 音乐播放器

先看效果 录制_2022_08_11_14_37_25_628 在网上找了一圈, 好多人写的资料敝竹自珍,还要收费真是无语。还有些需要用第三方库,真是没有必要。qt可以直接实现这些功能 音乐播放器的实现我就不贴了, 网上好多例子,我主要…

功能扩展——邮件发送、网页注册

邮件收发 转自这位大佬 电子邮件 要在网络上实现邮件功能,必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是smtp.xxx…

网站注册邮件发送功能实现

摘抄自狂神笔记 电子邮件 要在网络上实现邮件功能,必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是 smtp…

阿里巴巴国际站获得商品详情 API 调用分享(销量、详情图片、宝贝链接)

item_get-获得商品详情 alibaba.item_get 调用代码分享 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; imp…

利用用户搜索词生成商品标题信息——阿里巴巴IDST

今天介绍的论文是阿里IDST在2018年AAAI上发表的paper《A Multi-task Learning Approach for Improving Product Title Compression with User Search Log Data》。 其应用背景是,现在越来越多的用户开始习惯于使用手机、PAD等移动端进行网购行为,而这些移…

【阿里巴巴国际站API接口】商品详情接口,代码封装系列

为了进行电商平台 alibaba 的API开发,首先我们需要做下面几件事情。 1)开发者注册一个账号 2)然后为每个alibaba应用注册一个应用程序键(App Key) 。 3)下载 alibaba API的SDK并掌握基本的API基础知识和调用 4&#xf…

通过 Python 封装关键词搜索阿里巴巴商品api接口

以下是使用 Python 封装关键词搜索阿里巴巴商品列表数据的步骤: 使用 requests 库向阿里巴巴搜索接口发送 HTTP 请求,可以使用 GET 或 POST 方法,请求参数中应包含搜索关键词、每页展示数量、当前页码等信息。 解析返回的 response 中的 HTM…

中英文在线语音转文字的方法

今天小编就来给大家分享一个中英文在线翻译的方法,小编这个来给大家分享一个这样很好用的方法! 操作方法: 使用工具:录音转文字助手 第一步:如果将手机录音转成文字的话需要使用一个工具:录音转文字助手&a…