Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
123
返回列表 发新帖
楼主: 张延幸

张延幸:基于单片机的虚拟电子琴

[复制链接]

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
发表于 2023-4-22 16:31:47 | 显示全部楼层
好,做的不错,继续推进
回复

使用道具 举报

1

主题

20

帖子

149

积分

注册会员

Rank: 2

积分
149
 楼主| 发表于 2023-4-28 23:07:13 来自手机 | 显示全部楼层
项目已经基本完成,现在正在撰写初稿,预计明天能够完成初稿
回复

使用道具 举报

1

主题

20

帖子

149

积分

注册会员

Rank: 2

积分
149
 楼主| 发表于 2023-5-5 11:00:17 来自手机 | 显示全部楼层
这一周主要进行了初稿的撰写,外文翻译的撰写,修改琴键不跟随手指弹回的问题,也在不断改进虚拟琴的发声问题,任务比较多,争取不断突破。
回复

使用道具 举报

1

主题

20

帖子

149

积分

注册会员

Rank: 2

积分
149
 楼主| 发表于 2023-5-6 21:26:54 | 显示全部楼层
近期对电子音的探索
1.首先是让Python自己生成电子音,程序如下:
# 导入模块
import midi
# 设置音轨,音频文件的基础就是音轨,所有的音量和音色等属性都是要放在音轨上的
pattern = midi.Pattern()
track = midi.Track()
pattern = append(track)
# 设置音符的音量和音高等属性
on = midi.NoteOnEvent(tick=0,velocity=50,pitch=midi.G_3)
track.append(on)
# 结束音符
off = midi.NoteOnEvent(tick=1000,pitch=midi.G_3)
track.append(off)
# 结束音轨
eot = midi.EndOfTrackEvent(tick=1)
track.append(eot)
# 保存为midi文件
midi.write_midifile('example.mid',pattern)
这个程序运行后会显示缺少对应的模块,到cmd中下载对应库时,显示Python需要升级,当升级Python后又会显示Python版本不合适,网上有关该程序的帖子较少,目前正在探索中。
2.在原代码的基础上继续进行修改,原代码如下:
Audio(sound_file_name="文件名.wav")
但发出声音的时长受原文件时长的限制,所以需要用剪辑软件进行剪辑,目前也在不断地修改。
3.使用键盘敲击发出琴声,这个发出琴声仍需要文件库,接下来尝试敲击z键发出声音,程序如下:
from playsound import playsound
import pygame

pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption('pygame event')
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_z:
                playsound('1.wav')
    pygame.display.update()
通过测试成功发出了琴声,但是会弹出一个窗口,与现有的ursina窗口有一些冲突,目前也正在调试

本帖子中包含更多资源

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

x
回复

使用道具 举报

1

主题

20

帖子

149

积分

注册会员

Rank: 2

积分
149
 楼主| 发表于 2023-5-11 18:38:37 | 显示全部楼层
单片机与上位机Python实现串口通信
首先是单片机端程序:
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
void UartInit(void);        //9600bps@11.0592MHz
void SendByte(unsigned char dat);
void main()
{
        while(1)
        {
                                UartInit();
                                SBUF=0X00;
                                while(!TI);
                                TI=0;
                        }
void UartInit(void)                //9600bps@11.0592MHz
{
        TMOD=0X20;  // 设置定时器1工作于方式2
         TH1=0XFD;  // 设置串口通信波特率为9600
         TL1=0XFD;
         TR1=1;  // 开启定时器1,用以产生波特率
         REN=1;  // 打开串行中断允许
         SM0=0;  // 设置串行口工作于方式1
         SM1=1;;
                       
}
其次是Python端程序
import os  # 导入os模块,处理操作系统相关事务
import serial  # 导入serial模块,串口通信相关
from ursina import *
import random as rd

com = serial.Serial('COM97', 9600)  # 打开指定串口,设置串口通信波特率
def update():
   a = com.read()  # 从串口接收数据,类型为bytes
   b = int(a.hex(), 16)  # 将接收的数据转化为16进制数字型,注意是数字型,不是字符串型
由此即可实现串口通信
回复

使用道具 举报

1

主题

20

帖子

149

积分

注册会员

Rank: 2

积分
149
 楼主| 发表于 2023-5-16 10:51:49 | 显示全部楼层
根据老师的要求,目前完成了绪论部分和硬件设计部分的修改,其他部分的修改仍在进行中

本帖子中包含更多资源

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

x
回复

使用道具 举报

1

主题

20

帖子

149

积分

注册会员

Rank: 2

积分
149
 楼主| 发表于 2023-5-17 10:40:10 | 显示全部楼层
最新修改

本帖子中包含更多资源

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

x
回复

使用道具 举报

1

主题

20

帖子

149

积分

注册会员

Rank: 2

积分
149
 楼主| 发表于 2023-5-23 08:30:37 | 显示全部楼层
进行了修改,期待老师的批评指正

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-6-8 13:38 , Processed in 0.036927 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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