python自动演奏Freepiano【双手合奏】
文章编写背景
玩了N久的Freepiano,碍于本人没有天赋,左右手一直没法协调。
于是,突然奇想,也是代码设计的思路:
用多线程的方式,开两个线程,然后通过按键模拟的方式,分别模拟左右手去演奏。觉得可行,于是开干
依赖
import time
import pyautogui
import keyboard
from threading import Thread
大致分析
按键模拟
首先要研究按键模拟,就是获取所有键盘的Mapping值。然后发现很多坑:
1、部分依赖不支持小键盘(键盘最右边)
2、部分按键不能模拟(menu,right crtl等)
3、键盘上的按键是不一样的,但是他们的mapping值是一样的(home page up 等)
这时候需要分两步走,获取所有按键对应的mapping值,然后配置一个Mapping 常量,我们可以借助下面的片段:
import keyboard
# keyboard.press_and_release('num lock') # 小键盘锁键
def on_key_press(event):print("按键:", event.name)keyboard.on_press(on_key_press)
keyboard.wait()
运行后,任意按键会打印对应的Mapping值,这里注意的是小键盘的锁切换后会不一样
然后得到一个mapping常量(按自身实际配置):
left_hand_mapping = {'1': 'q','111': '8','2': 'w',"222": "9",'3': 'e','33': '3','4': 'r','44': '4','5': 't','55': '5','6': 'y','66': '6','7': 'u','77': '7','P': ' '
}right_hand_mapping = {'1': 'end','2': 'down','3': 'pagedown','333': 'alt','4': 'left','5': 'clear','555': "f2",'6': 'right','666': 'f1','666#': 'backspace','7': 'home','P': ' '
}
综合上面的坑,要对freepiano进行键位修改,这里的思路是放弃小键盘的锁键,还有HOME等功能键,见下图:
PS:这里要注意新按键的通道,因为左右手的力度是不一样的。
线程模拟
开始编码模拟左右手,因为左右手的演奏速度是不一样的,所以这里要做区分。
左手按键与松开:
def play_left_hand(melody):for note in melody:if note == "-":time.sleep(stop_note)press_key(note, 'left')time.sleep(note_duration_left)release_key_left(note)def release_key_left(note):if note in left_hand_mapping:keyboard.release(left_hand_mapping[note])
右手按键与松开:
def play_right_hand(melody):for note in melody:if note == "-":time.sleep(stop_note)press_key(note, 'right')time.sleep(note_duration_right)release_key_right(note)
def release_key_right(note):if note in right_hand_mapping:keyboard.release(right_hand_mapping[note])
按键方法:
def press_key(note, hand):if hand == 'left' and note in left_hand_mapping:left_hand_key = left_hand_mapping[note]keyboard.press(left_hand_key)if hand == 'right' and note in right_hand_mapping:right_hand_key = right_hand_mapping[note]keyboard.press(right_hand_key)
乐谱设计
这里是最重要的,这里我们用两个列表分别存左右手的音符。具体字符需要根据实际mapping值来设计
left_hand_melody = ['33', '66', '77', '111', '-', '44', '66', '77', '111', '-', '55', '66', '222', '111', '77']right_hand_melody = ["666", "666", "666", "-", "666", "666#", "666#", "666#", "555", "555", "555", "-", "555","333", "333", "333", "333"]
这是一段某游戏登录前奏。乐谱地址:简谱
具体效果
效果不理想,休止音符和节奏没设计好,下版本更新。。。。
具体效果:
python演奏Freepiano(双手合奏)DEMO1
。TBD
完整代码
key_mapping.py:
left_hand_mapping = {'1': 'q','111': '8','2': 'w',"222": "9",'3': 'e','33': '3','4': 'r','44': '4','5': 't','55': '5','6': 'y','66': '6','7': 'u','77': '7','P': ' '
}right_hand_mapping = {'1': 'end','2': 'down','3': 'pagedown','333': 'alt','4': 'left','5': 'clear','555': "f2",'6': 'right','666': 'f1','666#': 'backspace','7': 'home','P': ' '
}
piano.py
import time
import pyautogui
import keyboard
from threading import Thread
from key_mapping import *def play_left_hand(melody):for note in melody:if note == "-":time.sleep(stop_note)press_key(note, 'left')time.sleep(note_duration_left)release_key_left(note)def play_right_hand(melody):for note in melody:if note == "-":time.sleep(stop_note)press_key(note, 'right')time.sleep(note_duration_right)release_key_right(note)def press_key(note, hand):if hand == 'left' and note in left_hand_mapping:left_hand_key = left_hand_mapping[note]keyboard.press(left_hand_key)if hand == 'right' and note in right_hand_mapping:right_hand_key = right_hand_mapping[note]keyboard.press(right_hand_key)def release_key_left(note):if note in left_hand_mapping:keyboard.release(left_hand_mapping[note])def release_key_right(note):if note in right_hand_mapping:keyboard.release(right_hand_mapping[note])if __name__ == '__main__':repeat = Trueright_first = Trueleft_hand_melody = ['33', '66', '77', '111', '-', '44', '66', '77', '111', '-', '55', '66', '222', '111', '77']right_hand_melody = ["666", "666", "666", "-", "666", "666#", "666#", "666#", "555", "555", "555", "-", "555","333", "333", "333", "333"]note_duration_left = 0.4 # 每个音符的持续时间(秒) 左手note_duration_right = 0.3 # 每个音符的持续时间(秒) 左手stop_note = 0.1 # 休止音符# 切换到FreePiano界面time.sleep(2)freepiano_window = pyautogui.getWindowsWithTitle("FreePiano")[0]freepiano_window.activate()# 简谱是否重复if repeat:left_hand_melody.append("-")left_hand_melody += left_hand_melodyright_hand_melody.append("-")right_hand_melody += right_hand_melody# 启动左手伴奏和右手主旋律线程left_hand_thread = Thread(target=play_left_hand, args=(left_hand_melody,))right_hand_thread = Thread(target=play_right_hand, args=(right_hand_melody,))left_hand_thread.start()right_hand_thread.start()left_hand_thread.join()right_hand_thread.join()
python自动演奏Freepiano【双手合奏】相关推荐
- 用Python自动生成数据日报!
今天聊聊怎么用Python自动生成数据日报! 其实我觉得蛮简单,核心就是你组装好日报的内容模板,然后将变化的量交给python去填充,需要用到的基本就是python处理excel.word和ppt等相 ...
- python自动更新excel_Python办公自动化(六)|自动更新表格,告别繁琐
今天我们讲解的案例是如何使用Python自动更新Excel表格,简单来说就是每天都会对Excel中多个sheet进行更新,需要操作完后可以用程序完成第一张sheet 汇总表的更新,大概就是这样 当然实 ...
- Python 之vim编写python自动补全
Pydiction :vim - python自动补全插件 插件的安装如下: 1.下载插件包 https://github.com/vim-scripts/Pydiction 可以直接下载,也可git ...
- python资料百度网盘-python自动保存百度盘资源到百度盘中的实例代码
本实例的实现逻辑是,应用selenium UI自动化登录百度盘,读取存储百度分享地址和提取码的txt文档,打开百度盘分享地址,填入提取码,然后保存到指定的目录中 全部代码如下: # -*-coding ...
- python画轨迹曲线-python 自动轨迹绘制的实例代码
用到的思维: 自动化思维,数据和功能分开处理,用数据驱动程序自动运行 接口化设计,数据与程序的对接方式要清晰明了 二维数据应用,应用维度组织数据,二维数据最常用 代码 # AutoTrace.py i ...
- python自动化办公兼职-用Python自动办公,做职场高手(完结)
教程目录: ┣━07.S2 Word自动化处理,又快又好做文档 ┃ ┣━36 本章介绍 ┣━08.[Word]S2-1 轻松用Python快速生成Word文档 ┃ ┣━45.[真实案例]S2-1-3 ...
- python自动创建目录_python自动目录环境
python自动目录环境 1.建立工程目录** mkdir /myApp cd /myApp 2.建立 Python 虚拟环境 (1)Python3.3以上的版本通过venv模块原生支持虚拟环境 在m ...
- python自动源码_谷歌推出Tangent开源库,在Python源代码上做自动微分
原标题:谷歌推出Tangent开源库,在Python源代码上做自动微分 李林 编译自 Google Research Blog 谷歌今天推出了一个新的开源Python自动微分库:Tangent. 和现 ...
- python自动答题免费_直播答题?Python助你自动搜题之新手篇!
承接前文关于Python自动搜题的介绍https://zhuanlan.zhihu.com/p/32828411,此篇面向新手小白进行解析,助你成功运行自动搜题的python程序. A部分是介绍思路, ...
最新文章
- iphone个系列尺寸_iPhone 12系列、11系列尺寸对比
- 如何实施好基于MOSS的企业搜索项目(上)
- Hadoop学习笔记(8) ——实战 做个倒排索引
- 常见b2c网站购物车的设计
- nyist-508(余数求和)
- DAY5-小别-2018-1-15
- jpa onetoone_拥抱开源从表设计到 JPA 实现
- python多线程编程
- Android 功耗优化(1)----使用Battery Historian生成电量消耗报告
- 案例:实现在购物车中添加商品和删除购物车中指定商品的功能
- setTimeout(〒︿〒) 请原谅我一直以来对你的忽视
- TweenLite中文帮助手册
- 电脑博主fps测试软件,APP性能测试—帧率
- tracepro中文pojie版-tracepro附安装教程
- ArcGIS教程:MapGIS转换shp攻略
- 【自我解析】2020华为杯数学建模比赛C题
- 所谓的360,到底窥探了你多少隐私
- 通过 Land of Lisp 中的超简短字符游戏例程学习 loop 和 format
- 视频显著性检测----《Flow Guided Recurrent Neural Encoder for Video Salient Object Detection》
- scapy:网络数据包操作
热门文章
- Bing网站背景壁纸下载神器
- 注册德国商标条件和程序材料注意事项
- C++高阶 返回值优化--RVO和NRVO介绍
- 暖科技激活清明上河图,井贤栋:里面有最美的数字中国
- __toString()方法
- PDF 无法打印 Foxitsoftware Pdf Reader
- 常州买衣服(优先队列)
- matlab中建立水火电站模型,基于MATLAB的漫水湾水电厂电气主接线系统建模与仿真...
- Redis(8)——发布/订阅与Stream
- PayPal sdk v1版本php开发支付过程