疫情在家没事干?不如上网看一看!平时闲的没事的我最近沉浸在逛美食制作的视频当中,试图用为数不多的材料做出属于自己的那份美味。突然,我被其中一个视频的bgm钢琴曲迷住了,突然有了一种想弹钢琴的想法,可是又没有钢琴,那咋办呢。。。然后一个朋友就说了:“你个憨憨,按键盘不就好咯”,想了想,好像有这么几分道理,于是就想到了用pygame模块播放音频的方法制作这个钢琴小玩具。
首先呢,这肯定是会有一些小瑕疵的,充其量自己拿着玩,跟真的钢琴比手感肯定是差很多的。
一开始没有头绪是吧,我们就想想钢琴是怎样的一个东西——按键,然后出一个声音。那么我们是不是只需要写一个程序,将输入的按键与播放的声音绑定起来就可以了呢。
啊那么有的同学就会问了:老师,我们没有键盘怎么办呢,我想弄一个手机那样的虚拟按键行不行啊!
对于这个问题呢,我的回答是:自己优化去吧(一边玩蛋去)
那么我们有什么可以用的工具或者模块吗?有的,就是pygame这个模块。那么有的杠精同学可能又要问了:”这不是写游戏的吗?“ “诶对,我就把它当游戏来写”
#首先我们会用到三个模块:pygame、sys、time,
#pygame用作游戏运行的窗口创建和按键绑定、文件的读取,是主要部分
#sys用于窗口的正常退出,也就是只用一句sys.quit()而已
#time用于给两次按键输入一点间隔时间
import pygame
import sys
import time
from pygame.locals import *
#其中呢,locals存的就是pygame里按键的映射,就是按键的识别
简简单单的头文件,接下来我们先创建一些所需要的变量,比如创建的窗口大小啦,按键对应钢琴键盘的哪个音啦之类的,如下我就创建了一个宽300px,高200px的一个框作为游戏框,不然在桌面按键盘可能会不小心按到一些不太好的东西(指游戏),然后创了一个字典来存按键对应的音调
#不清楚按键有什么的话可以自行搜一下
keyDict={
K_1:"c",
K_2:"d",
K_3:"e",
K_4:"f",
K_5:"g",
K_6:"a",
K_7:"b",
K_8:"c1",
K_9:"d1",
K_0:"e1",
K_MINUS:"f1",
K_EQUALS:'g1',
K_q:'a1',
K_w:'b1',
K_e:'c2',
K_r:'d2',
K_t:'e2',
K_y:'f2',
K_u:'g2',
K_i:'a2',
K_o:'b2',
K_p:'c3',
K_a:'d3',
K_s:'e3',
K_d:'f3',
K_f:'g3',
K_g:'a3',
K_h:'b3',
K_j:'c4',
K_k:'d4',
K_l:'e4',
K_z:'f4',
K_x:'g4',
K_c:'a4',
K_v:'b4',
K_b:'c5'
}
bg_size = width, height = 300,200
那么剩下的就是很简单的创建窗口和逻辑循环
#窗口创建部分
pygame.init()
pygame.mixer.init()
#上面两句是创建pygame对象
screen = pygame.display.set_mode(bg_size)
#这句是设置窗口大小
pygame.display.set_caption("Music")
#设置窗口标题
pygame.mixer.set_num_channels(32)
#设置音道数,因为播放一个音频是需要一条音道的,如果音道数量不够就会出现按键声音不出来的情况,也就是阻塞了
#pygame逻辑部分
while True:
#while大循环用于每次的按键输入,当for循环得到输入是右上角的X时就关闭程序,否则就输出音频
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
key = event.key
#下面这句就是找对应按键的音频
if key in keyDict.keys():
pygame.mixer.Sound("audios/" + keyDict[key] + ".wav").play(maxtime = 1500)
#Sound里拼接起来是文件的路径
#maxtime是设置每个音频播放的最长时间,以免音乐一直占着一个音道阻塞
#sleep使每次输入之间存在间隔,其实好像可以不要
time.sleep(0.01)
懒得敲可以直接按顺序拼接代码即可
源代码带音频文件:https://gitee.com/dkchaos/mypiano1st.git
(说实话很想用github的链接的但是真的打不开于是转用码云的链接,一样的)