【补档】手把手教你用C++演奏音乐(干货)

手滑把稿子发了,删了补档下
代码核心是两个函数:Beep函数Sleep函数
先放代码(Tips:这是我半年前写的,有些内容的实现有更好的方法,如果想了解请继续往下看~)

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
#define fa0 174.61411571650194
#define la0 220.0
#define do1 261.6255653005986
#define re1 293.66476791740763
#define mi1 329.62755691286986
#define fa1 349.22823143300394
#define so1 391.9954359817492
#define la1 440.0
#define jsi1 466.163761518098
#define si1 493.88330125612424
#define do2 523.2511306011972
#define re2 587.3295358348153
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cout<<"《别让我担心》"<<endl;
	Sleep(1145.14);
	cout<<"演唱:派蒙——多多poi"<<endl;
	Sleep(1145.14);
	cout<<"词曲、音乐制作:ChiliChill"<<endl;
	Sleep(1145.14);
	cout<<"编曲:頼暐哲、ChiliChill"<<endl;
	Sleep(1145.14);
	cout<<"MV:KKOMDA and Frank"<<endl;
	Sleep(1145.14);
	cout<<"天气晴 风平浪静 沙滩上混乱的脚印"<<endl;
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(fa1,562.5);
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(fa1,562.5);
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(so1,375);
	Beep(fa1,750);
	Beep(do1,375);
	Beep(do1,1500);
	cout<<"钓鱼竿 两份孤单 会飞的落汤鸡"<<endl;
	Beep(do1,187.5);
	Beep(re1,187.5);
	Beep(fa1,562.5);
	Beep(fa1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,562.5);
	Beep(la1,187.5);
	Beep(re2,187.5);
	Beep(do2,187.5);
	Beep(la1,375);
	Beep(so1,375);
	Beep(fa1,987.5);
	Sleep(375);
	cout<<"是故事的开局"<<endl;
	Beep(la1,187.5);
	Beep(do2,187.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(fa1,375);
	Beep(fa1,562.5);
	cout<<"青橙紫绿 留影机塞满了回忆"<<endl;
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(fa1,562.5);
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(so1,375);
	Beep(fa1,750);
	Beep(do1,375);
	Beep(do1,562.5);
	Beep(re1,187.5);
	Beep(fa1,562.5);
	cout<<"可我却 无比思念"<<endl;
	Beep(do1,187.5);
	Beep(re1,187.5);
	Beep(fa1,562.5);
	Beep(fa1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,562.5);
	cout<<"遇见你的那一集"<<endl;
	Beep(la1,187.5);
	Beep(re2,187.5);
	Beep(do2,187.5);
	Beep(la1,375);
	Beep(so1,187.5);
	Beep(fa1,187.5);
	Beep(fa1,1687.5);
	Sleep(1875);
	cout<<"才发现 我们早已 走了很远很远"<<endl;
	Beep(re2,187.5);
	Beep(do2,375);
	Beep(do1,750);
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(la1,375);
	Beep(la1,1312.5);
	Beep(fa1,187.5);
	Beep(mi1,562.5);
	Beep(re1,187.5);
	Beep(mi1,562.5);
	Beep(fa1,187.5);
	Beep(fa1,562.5);
	Sleep(375);
	cout<<"多少遍 四目相对 感叹幸亏幸亏"<<endl;
	Beep(re2,187.5);
	Beep(do2,375);
	Beep(do1,750);
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(la1,375);
	Beep(la1,1312.5);
	Beep(do1,187.5);
	Beep(re1,562.5);
	Beep(do1,187.5);
	Beep(re1,562.5);
	Beep(do1,187.5);
	Beep(do1,562.5);
	Sleep(2625);
	cout<<"我想起一句花语"<<endl;
	Beep(do1,375);
	Beep(do1,562.5);
	Beep(do1,187.5);
	Beep(re1,375);
	Beep(do1,375);
	Beep(la0,375);
	Beep(fa0,375);
	Sleep(3375);
	cout<<"突然想送给你"<<endl;
	Beep(do1,375);
	Beep(do1,187.5);
	Beep(la0,187.5);
	Beep(do1,375);
	Beep(re1,375);
	Beep(do1,375);
	Sleep(562.5);
	cout<<"摘一朵纯白色的花"<<endl;
	Beep(la1,562.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(la1,375);
	cout<<"塞西莉亚 塞西莉亚"<<endl;
	Beep(do2,187.5);
	Beep(re2,375);
	Beep(do2,375);
	Beep(la1,562.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(la1,375);
	Beep(do1,750);
	cout<<"盛开在起风的地方"<<endl;
	Beep(la1,562.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(la1,562.5);
	cout<<"沐浴九月的骄阳"<<endl;
	Beep(fa1,187.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(fa1,375);
	Beep(so1,375);
	Beep(la1,375);
	Beep(so1,750);
	Sleep(375);
	cout<<"偷偷放在你的身上"<<endl;
	Beep(la1,562.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(la1,562.5);
	cout<<"替我传达 我不敢说的话"<<endl;
	Beep(do2,187.5);
	Beep(re2,375);
	Beep(do2,375);
	Beep(la1,562.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(la1,375);
	Beep(do1,375);
	Beep(mi1,375);
	Beep(re1,750);
	cout<<"在流浪的路上"<<endl;
	Beep(la1,375);
	Beep(do1,375);
	Beep(re1,750);
	Beep(la1,375);
	Beep(fa1,375);
	Beep(so1,750);
	Sleep(187.5);
	cout<<"你是我唯一牵挂"<<endl;
	Beep(mi1,187.5);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(fa1,375);
	Beep(fa1,937.5);
	Sleep(3375);
	cout<<"你是我唯一牵挂"<<endl;
	Beep(mi1,187.5);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(fa1,375);
	Beep(fa1,937.5);
	Sleep(3000);
	cout<<"所以别让我担心啊"<<endl;
	Beep(mi1,187.5);
	Beep(re1,187.5);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(fa1,375);
	Beep(fa1,937.5);
	Sleep(10687.5);
	cout<<"抱歉我 那么懦弱 总是爱躲在你身后"<<endl;
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(fa1,562.5);
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(fa1,562.5);
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(so1,375);
	Beep(fa1,750);
	Beep(do1,375);
	Beep(do1,1500);
	cout<<"有太多 聒噪笨拙 多谢你的包容"<<endl;
	Beep(do1,187.5);
	Beep(re1,187.5);
	Beep(fa1,562.5);
	Beep(fa1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,562.5);
	Beep(la1,187.5);
	Beep(re2,187.5);
	Beep(do2,187.5);
	Beep(la1,375);
	Beep(so1,375);
	Beep(fa1,987.5);
	cout<<"啊~认识你这么久"<<endl;
	Beep(la1,562.5);
	Beep(la1,187.5);
	Beep(la1,187.5);
	Beep(jsi1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(fa1,562.5);
	cout<<"我学会了 一点点勇敢和温柔"<<endl;
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(fa1,562.5);
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(so1,375);
	Beep(fa1,750);
	Beep(do1,375);
	Beep(do1,562.5);
	Beep(re1,187.5);
	Beep(fa1,562.5);
	cout<<"拉勾勾 关键时候"<<endl;
	Beep(do1,187.5);
	Beep(re1,187.5);
	Beep(fa1,562.5);
	Beep(fa1,187.5);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,562.5);
	cout<<"我不会再退缩"<<endl;
	Beep(la1,187.5);
	Beep(re2,187.5);
	Beep(do2,187.5);
	Beep(la1,375);
	Beep(so1,375);
	Beep(fa1,1687.5);
	Sleep(1875);
	cout<<"星空也 猜不出 你要去的方向"<<endl;
	Beep(re2,187.5);
	Beep(do2,375);
	Beep(do1,937.5);
	Beep(fa1,187.5);
	Beep(la1,375);
	Beep(la1,1312.5);
	Beep(fa1,187.5);
	Beep(mi1,562.5);
	Beep(re1,187.5);
	Beep(mi1,562.5);
	Beep(fa1,187.5);
	Beep(fa1,562.5);
	Sleep(187.5);
	cout<<"我许愿 能一直尝 你做的甜甜酿"<<endl;
	Beep(re2,187.5);
	Beep(do2,375);
	Beep(do1,750);
	Beep(do1,187.5);
	Beep(fa1,187.5);
	Beep(la1,375);
	Beep(la1,1312.5);
	Beep(do1,187.5);
	Beep(re1,562.5);
	Beep(do1,187.5);
	Beep(re1,562.5);
	Beep(do1,187.5);
	Beep(do1,562.5);
	Sleep(3000);
	cout<<"其实你也会累吧"<<endl;
	Beep(do1,375);
	Beep(do1,562.5);
	Beep(do1,187.5);
	Beep(re1,375);
	Beep(do1,375);
	Beep(la0,375);
	Beep(fa0,375);
	Sleep(3375);
	cout<<"也有会痛的伤"<<endl;
	Beep(do1,375);
	Beep(do1,187.5);
	Beep(la0,187.5);
	Beep(do1,375);
	Beep(re1,375);
	Beep(do1,375);
	Sleep(562.5);
	cout<<"摘一朵纯白色的花"<<endl;
	Beep(la1,562.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(la1,375);
	cout<<"塞西莉亚 塞西莉亚"<<endl;
	Beep(do2,187.5);
	Beep(re2,375);
	Beep(do2,375);
	Beep(la1,562.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(la1,375);
	Beep(do1,750);
	cout<<"没有人见过它枯黄"<<endl;
	Beep(la1,562.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(la1,562.5);
	cout<<"就像你纯粹坚强"<<endl;
	Beep(fa1,187.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(fa1,375);
	Beep(so1,375);
	Beep(la1,375);
	Beep(so1,750);
	Sleep(375);
	cout<<"我回看那座摘星崖"<<endl;
	Beep(la1,562.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(la1,562.5);
	cout<<"当初眺望 的碧海和山峦"<<endl;
	Beep(do2,187.5);
	Beep(re2,375);
	Beep(do2,375);
	Beep(la1,562.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(la1,375);
	Beep(do1,375);
	Beep(mi1,375);
	Beep(re1,375);
	cout<<"你的答案 还在远方"<<endl;
	Beep(re1,187.5);
	Beep(la1,375);
	Beep(do1,375);
	Beep(re1,562.5);
	Beep(re1,187.5);	
	Beep(la1,375);
	Beep(fa1,375);
	Beep(do2,750);
	Sleep(750);
	cout<<"抵达之前"<<endl;
	Beep(la1,375);
	Beep(la1,375);
	Beep(la1,375);
	Beep(fa1,375);
	cout<<"送给你纯白色的花"<<endl;
	Beep(la1,562.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(la1,375);
	cout<<"塞西莉亚 塞西莉亚"<<endl;
	Beep(do2,187.5);
	Beep(re2,375);
	Beep(do2,375);
	Beep(la1,562.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(la1,375);
	Beep(do1,750);
	cout<<"盛开在起风的地方"<<endl;
	Beep(la1,562.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(la1,562.5);
	cout<<"沐浴九月的骄阳"<<endl;
	Beep(fa1,187.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(fa1,375);
	Beep(so1,375);
	Beep(la1,375);
	Beep(so1,750);
	Sleep(375);
	cout<<"偷偷放在你的身上"<<endl;
	Beep(la1,562.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(fa1,187.5);
	Beep(so1,187.5);
	Beep(la1,375);
	Beep(do2,375);
	Beep(la1,562.5);
	cout<<"替我传达 我不敢说的话"<<endl;
	Beep(do2,187.5);
	Beep(re2,375);
	Beep(do2,375);
	Beep(la1,562.5);
	Beep(la1,187.5);
	Beep(so1,375);
	Beep(la1,375);
	Beep(do1,375);
	Beep(mi1,375);
	Beep(re1,750);
	cout<<"在流浪的路上"<<endl;
	Beep(la1,375);
	Beep(do1,375);
	Beep(re1,750);
	Beep(la1,375);
	Beep(fa1,375);
	Beep(so1,750);
	Sleep(187.5);
	cout<<"你是我唯一牵挂"<<endl;
	Beep(mi1,187.5);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(fa1,375);
	Beep(fa1,937.5);
	Sleep(3375);
	cout<<"无尽海上的星光"<<endl;
	Beep(mi1,187.5);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(fa1,375);
	Beep(fa1,937.5);
	Sleep(3000);
	cout<<"所以别让我担心啊"<<endl;
	Beep(mi1,187.5);
	Beep(re1,187.5);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(fa1,375);
	Beep(fa1,937.5);
	Sleep(9375);
	cout<<"所以别让我担心啊"<<endl;
	Beep(mi1,125);
	Beep(re1,125);
	Beep(re1,125);
	Beep(mi1,375);
	Beep(re1,187.5);
	Beep(mi1,375);
	Beep(fa1,375);
	Beep(fa1,937.5);
	return 0;
}

文件: 别让我担心.rar - 蓝奏云 (lanzoub.com)
视频版:【C++】爆肝527行只为这首《别让我担心》!_哔哩哔哩_bilibili
接下来正式开始教学

  1. 普普通通的头文件&框架
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
int main()
{
	
	return 0;
}

不要忘记#include <windows.h>
否则Beep函数和Sleep函数都会报错

  1. 音高赋值
    在Beep函数中,音高的单位是赫兹
    但是几乎每个音的音高(单位用赫兹)都是浮点数,你总不能每次打一长串浮点数吧
    所以有了如下的改进方法
	h[360]=440.0;
	int cnt=110;
	for(int i=0;i<=128;i++){
		if(cnt/10%10==8){
			cnt+=30;
			continue;
		}
		if(cnt%100==35||cnt%100==75){
			cnt+=5;
			continue;
		}
		h[cnt]=(h[360]/32.0)*pow(2,(i-9.0)/12.0);
		//cout<<cnt<<" "<<h[cnt]<<"\n";
		cnt+=5;
	}

i的界限可以随便定(当然别超过int类型的范围)
cnt用来遍历h数组的下标
h数组的下标是音高
个位表示是否为半音
对,就是你(不太)经常看到的‘#’号(划掉)
但是,3-mi和7-si没有半音,所以就cnt+=5然后continue掉
十位分别表示do re mi fa sol la si,然而我们用的是十进制,所以当便历到80时cnt+=30再continue掉就好了
百位:一般的曲子最高音最低音至少会差一个八度,这个百位用来记录八度,具体记录第几个八度没有硬性要求
其他:h[360]=440.0 这是整数,方便计算
h[cnt]=(h[360]/32.0)*pow(2,(i-9.0)/12.0); 频率计算公式,这个与乐理有关,在C++论坛上就不多说了哈(可以问度娘)
注释部分可用于调试,可对照下面这幅图

  1. 重点-演奏部分
	Beep(114,514);

Beep函数,后接个参数,第一个表示音高,单位是赫兹,后一个表示音长,单位是毫秒,在代码中充当音符
上述代码运行时,将会发出一个高114赫兹,长514毫秒的音

	Sleep(1919.810);

Sleep函数,后接个参数,表示停止的时长,单位是毫秒,在代码中充当休止符
上述代码运行时,将会停止1919.810毫秒
懂得这两个函数后,你就可以找到简谱/五线谱,一个一个对着音符/休止符写代码了(当然具体音符/休止符的时长计算我不教,因为这是C++论坛啊喂)
还有,一个四分音符的音长=60/速度*1000
并不具体的代码:

	Beep(h[310],a);
	Beep(h[320],a);
	Beep(h[330],a);
	Beep(h[340],a);
	Beep(h[350],a);
	Beep(h[360],a);
	Beep(h[370],a);
	Beep(h[410],a);
	Sleep(a);
	Beep(h[410],a);
	Beep(h[370],a);
	Beep(h[360],a);
	Beep(h[350],a);
	Beep(h[340],a);
	Beep(h[330],a);
	Beep(h[320],a);
	Beep(h[310],a*2);

当然如果你想做一整首曲子的话肯定有优化方法,但只适用于伴奏或纯音乐
一般一整首音乐可分为A1段 B1段……
然后A1段再现了!
通俗点说,就是写几个函数,有重复出现的乐段就调用
框架就像这样:

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
void A1(){
	//...
}
void B1(){
	//...
}
int main()
{
	A1();
	B1();
	return 0;
}

4.细节增加
比如在演奏前输出作者等信息(建议用Sleep函数等待一两秒)
和输出每一句的歌词
如果你写了下面两行代码:

	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);

关流可能会导致歌词输出与乐句演奏不同步,如果出现上述情况要删掉
以上。
(话说C++小游戏之类的帖子都没被封,我这种总不至于关闭吧qwq)

15 个赞

同意,膜拜中。

4 个赞

膜拜+1
崇拜中…

5 个赞

+1

5 个赞

+1

5 个赞

完全没见过,大佬膜拜

3 个赞

管理千万别锁啊!!!qwq

4 个赞

好厉害,作者怎么想到做这个的教程的?

4 个赞

%%%膜拜大佬

5 个赞

膜拜大佬%%%

4 个赞

小破站点赞了

4 个赞

emmm,差不多可以关了

3 个赞