找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 2720|回复: 3

中A:Piano项目

[复制链接]

28

主题

91

回帖

2715

积分

超级版主

积分
2715
发表于 2-26-2025 22:22:02 | 显示全部楼层 |阅读模式
Pygame如何发声呢?
数字音乐模块Mixer初始化:  pygame.mixer.init( )
实际上:pygame.init()里会自动初始化子模块mixer,所以通常pygame.init()即可
如果不需要pygame的windows窗口,只是需要发声,就使用pygame.mixer.init( )

声音文件对象准备(必须先mixer模块init或pygame init())
  mySound = pygame.mixer.Sound('c4.ogg’' #得到声音对象mySound
  音效文件支持 .ogg, .wav, .mp3

播放声音
mySound.play( )
注意:播放声音的.play()是立即返回(后台发声),而不是等到声音播放完毕才返回。

piano.zip压缩包里有88个钢琴琴键对应的声音文件,命名规则:
  比如 a4.ogg, 就是中音的A也就是La
  比如 c5m.ogg, 就是高音的升A也就是升Do,m就是升半音的意思


先输入下面这个简单程序,就可以弹Do和Re,自己增加代码让程序可以弹更多音,并弹几句熟悉的旋律。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

28

主题

91

回帖

2715

积分

超级版主

积分
2715
 楼主| 发表于 3-1-2025 08:47:01 | 显示全部楼层
作业:

课堂的Piano V1.1只能弹白键,请同学们增加黑键功能。
要增加黑键,就要有设计,因为显然电脑键盘不支持3个八度的黑键+白键
这里给出一个键盘分布设计参考

如图所示,支持两个半八度,并且每一个白键和黑键的对应位置接近钢琴习惯。
从程序实现角度,首先要理解:
soundList, keyList, keyFlagList,同一个下标指向同一件事。
程序是在init的时候,保证soundList和keyList的同一个下标指向同一个音。
那么对于新的键盘分布,也要通过init的流程来实现下标同步。
文件名角度,每个CDEFGAB的升半音,文件名加了m,也就是说CDFGA有m
只要解决了init,弹奏黑键就实现了。
那么下一个难点是”音符显示“。V1.1程序只有21个白键,排成一排,那么用下标*琴键宽度就可以得到对应音符的x坐标。但是加了黑键之后,就复杂了。可以先实现上一步”弹奏“,新版本的”考虑黑白键的音符显示“,需要你认真再想办法,加油!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

28

主题

91

回帖

2715

积分

超级版主

积分
2715
 楼主| 发表于 3-2-2025 14:27:52 | 显示全部楼层


V1.1代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

28

主题

91

回帖

2715

积分

超级版主

积分
2715
 楼主| 发表于 3-7-2025 17:32:26 | 显示全部楼层
完成了piano的“黑键版本”,可以再向前进发。

不过请同学们一定做好版本管理。
比如课堂的代码版本是V1.1,那么文件名应该也是piano V1.1,程序开始的注释也要写清楚
如果黑键版本是V1.2,文件名也应该是piano V1.2,然后程序开始的注释版本历史要保留,比如:
V1.1 基础版本
V1.2 黑键版本,不含音符显示
V1.3 黑键版本,黑白键音符显示都正常
然后呢,咱们再继续,做“可录音的电子琴”。
真实世界的电子琴就是可以录音的,录的什么呢?其实是:每个琴键的按键时间,然后按照精确的时间点播放琴键对应的声音文件(是的,电子琴里就是一大堆高级声音文件)。
程序里就这样做,使用time模块最方便。具体:
import time
用time.time() 得到这一瞬间的时间
用两次time.time() 的差得到间隔时间
每一次按键,和此次按键的持续时间(就是和上一次按键的时间间隔),分别存在各自的list里
那么播放的时候,同样的下标,就可以取到具体哪个音(就是按键,用sound.play()播放),和时长(用time.sleep(t)保证放够时间)。
这样就可以完成“可录音电子琴”。
还要有界面设计。要有录音键(Play/Stop用同一个键),播放键。录音的时候最好能显示一个红色标志。
当然,从编程的角度来说,类似黑键的分布实现。也应该先实现黑键的功能,再实现界面。
提供一个文档,方便大家的pygame简单功能查询,比如event.key的各键值(尤其空格、Enter等)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RealDevClub ( 沪ICP备2024093864号-1 )

GMT+8, 5-10-2025 20:28 , Processed in 0.064510 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表