用C/C编写一个简单的钢琴程序++

UI设计


浏览:652 次

0.原因

C语言类的最终作业。因为这是一个开放式作业,所以它是为了好玩而随便写的。虽然我在高中时接触过一些音乐或音频软件,如Au、FLstudio、Minecraft等,但实际上我对音乐一无所知。原因是,与许多同龄人不同,我的父母在我小时候没有强迫我学习乐器,所以我没有接受正规的音乐理论教育。如果本文或本文中的代码中存在一些低级音乐常识错误,请不要犹豫,给我们您的建议。当然,作为一名半年前刚刚接触代码的新生,代码中存在许多漏洞、不规则和可优化的地方。我也希望给予更多的理解和建议。

1.环境

Win10系统

Micosoft cl编译器,msvc开发工具包

为什么使用VS2019白嫖版中包含的cl编译器将在后面解释

Visual Studio代码编辑器、代码运行器插件、C/C++扩展插件

任务。vscode中的json文件。不要问我为什么任务名称同时是“构建”和“测试”

发射。vscode中的json文件不需要以下g++

引用头文件或类:iostream、线程、字符串h、windows。h、 科尼奥。h、 mm系统。h、 标准库.h

链接库:winmm.lib

计算机配置:

穷人家,买不起好机器

2.想法

考虑写作过程中可能出现的问题以及需要特别注意的要点:

2.1如何在节目中播放声音?

我在网上查了一下,它似乎在mmsystem中。h头文件提供了Windows本身的api函数mciSendString,可以播放媒体文件。不幸的是,使用此函数需要链接一个动态库,而我一直使用的g++编译器不仅链接起来非常麻烦,而且在g++附带的库中找不到它。很多鞋经过检查,大致说gcc和g++属于Linux系统的编译器,因此它们提供的许多api函数都连接到了Linux。无奈之下,我不得不下载微软的VS2019白嫖版(理论上,visual c++也应该可用)。在调整了一些环境变量后,我用cl编译了它,发现声音可以播放。

2.2钢琴上每个键的声音来自哪里?

这是一个相对简单的问题。看看一些在线钢琴:

原始网站:https://virtualpiano.net/

发现当网页打开时,服务器会发送一系列MP3文件。不用说,这是每个按键对应的音调。这样做很容易,所以我们设计了一个爬行器来爬行:

导入请求

简列表=['C','Cs','D',“Ds”,“E”,“F”,“Fs”,”G“,”Gs“,”A“,”As“,”B“]

jielist=[范围(7)中x的str(x)]

对于jianlist中的jian:

对于jielist中的jie:

url=“https://cdn.jsdelivr.net/gh/warpprism/cdn@最新/au\

托皮亚诺/静态/样本/明亮_钢琴/“+健+杰+”.mp3“

路径=您需要的路径+jian+jie+“.mp3”

标题={

“用户代理”:“Mozilla/5.0(Windows NT 6.3;Win64;x64)Apple\

WebKit/537.36(KHTML,像壁虎)Chrome/76.03809.132 Safari/537.36“

}

response=requests.get(url,headers=headers)

打开(路径,模式=“wb”)为f:

f、 写入(response.content)

打印(路径+“完成”)

打印(“结束”)

当时,爬虫程序是为爬行这个网站而编写的(我非常感谢autopiano.cn在编写这个程序的过程中提供的参考和启发,很抱歉使用爬虫程序消耗了一些服务器资源。我真的很抱歉),但截至编写时,这个网站的底层源代码已经更改(我应该这样称呼它吗?),当打开网页并更改语音时,服务器不会发送一系列MP3文件,而是发送一个js文件。我不太了解具体的工作原理,这需要在未来进一步探索。

2.3如何在短时间内播放多种声音?

钢琴上的一个音符可以持续3秒或更长时间。但两个音符之间的间隔远小于3秒。如何使用mciSendString函数播放声音,同时保持程序运行并播放下一个声音,而不是停止该函数?

答案是多线程。

但是,由于以前的g++编译器已被cl编译器取代,因此没有pthread。h在微软的开发工具包中,pthread的手册介绍。h更复杂(太懒了),所以这个程序使用了c++11编译器,它的功能远远少于pthread h。它是一个富线程类,随Microsoft的开发工具包提供,非常容易使用,并且自然(大致)适应Windows。

(似乎有一个进程.h也可以是多线程的?但使用起来有点麻烦。这个程序中涉及的多线程方面相对简单,所以越简单越好)

2.4如何实现键盘按键与声音的对应?

由于声音文件的名称tha