我是如何紧跟新技术革命,玩转ChatGPT,帮我电脑Windows,树莓派Linux和手机Android三者数码硬件控制和软件开发编程技术突飞猛进的!首先确立一个学习目标,就是数码和音乐控制编程结合,紧紧抓住最新出现的科技革命之产物-ChatGPT,实现数码开发和编程的快捷突破。来看看怎样从古董电脑低层数码PC1500突变跳过51,stm32,arduino到最强卡片电脑树莓派4BLinux的Python,再到Windows和手机的控制和编程,全靠你了ChatGPT!
我学习数码硬件电路设计和软件和编程,为何选择了电子音乐控制和编程,实现自动化操作和演奏?主要是数码音乐,可以用单片机产生很简单的振荡器,编程控制不同频率下的单音发音就可以听到单音乐曲声。也可以越来越复杂到多声部的复音音乐控制和编程。可以学习到工控数码界遇到的大多数出现的技术场景,比如,中断,多线程,高速数据采集和数据分析,五线谱各种符号和根音和弦编解码技术,国际音乐编解码MIDI,各种MP3,VGM等编解码技术分析,复杂音乐信号的FTT频谱波形分析和处理,各种音源芯片(主要是雅马哈和飞利浦声卡合成器的大规模集成电路的音源芯片)的寄存器读写控制和包络线控制和编程,音频信号的A/D,D/A转换等。数码音乐就是看得见听得到,摸得到,不求其它更多贵重设备配合就比较容易地学习和理解差不多所有工控所对应的数码应用技术。
随着最近火爆的人工智能ChatGPT的到来,对于我的数码的技术学习和开发更加方便快捷进步更加神奇神速了。
我是如何让我的ChatGPT3.5版帮我编程控制手机电子琴的?我提出了三连问。
我向ChatGPT提问之一:
如何使用python编程,来实现电脑和手机自动化操作“完美钢琴”手机版的按键坐标控制发音,从简谱音符1-7钢琴键?
ChatGPT答案:
很抱歉,作为AI语言模型,我无法直接在您的手机上编程。不过,您可以像下面这样编写Python脚本来控制手机应用程序的按键。
首先,您需要在手机上安装一触即发软件,并打开完美钢琴应用程序。然后,您需要在一触即发软件中打开“应用控制”功能,选择完美钢琴应用程序,并记录每个按键的屏幕坐标。
对于完美钢琴应用程序,您可以使用Python的`uiautomator2`库来控制按键的坐标。以下是一个简单示例,演示如何使用`uiautomator2`库在完美钢琴应用程序中按下一个按键:
```python
import uiautomator2 as u2
import time
# 连接到手机设备
d = u2.connect()
# 打开完美钢琴应用程序
# 假设应用程序已经打开并位于前台
# 如果需要打开应用程序,请使用以下命令:
# d.app_start("com.gamestar.perfectpiano")
# 按下一个按键,坐标为(100, 200)
d.touch(100, 200)
# 等待一段时间
time.sleep(1)
# 释放按键
d.touch(100, 200, u2.ToolMethod.DOWN_AND_UP)
```
完成上述步骤后,可以使用以下代码来按照 1 到 7 的顺序播放钢琴音符:
```python
import uiautomator2 as u2
import time
# 连接到手机设备
d = u2.connect()
# 打开 ORG 2023 应用程序
d.app_start("com.eumlab.android.organ")
# 举例定义一组按键坐标从中央音C4-B4,对应简谱1-7
key_coords = {
1: (146, 1254),
2: (213, 1254),
3: (280, 1254),
4: (348, 1254),
5: (414, 1254),
6: (480, 1254),
7: (546, 1254)
}
# 播放 1 到 7 的音符
for i in range(1, 8):
# 按下按键
d.touch(*key_coords[i])
# 等待 0.2 秒
time.sleep(0.2)
# 松开按键
d.touch(*key_coords[i], u2.ToolMethod.DOWN_AND_UP)
# 等待 0.2 秒
time.sleep(0.2)
```
以上代码假设应用程序已经打开并位于前台。如果您需要首先打开应用程序,请确保已经在`d.app_start()`方法中传递了应用程序的包名和 activity 名称。
请注意,以上代码只提供了一个简单示例。如果您需要执行更为复杂的操作,请先详细阅读 uiautomator2 库的文档和示例,并谨慎操作。
为了进一步编程理解,我又问ChatGPT提出第二个问题:
如何使用python的uianlomator2库编程来实现自动化操作手机版“完美钢琴”app的按键坐标,来控制发音,音程从A0到C8一共88钢琴键?
答二:
1. 安装uiautomator2库:在终端中使用pip install uiautomator2进行安装。
2. 连接手机:使用USB连接手机,并确保手机已启用开发人员选项和USB调试选项。
3. 启动app:使用uiautomator2库中的Device和app_start方法,启动“完美钢琴”app。
4. 获取键盘坐标:使用uiautomator2库中的click、swipe和dump_hierarchy方法,获取88个钢琴键的坐标。
5. 实现按键操作:使用uiautomator2库中的click方法,模拟点击钢琴键的坐标,实现自动发音。
6. 控制音程:使用for循环遍历88个键,按照音程从A0到C8的顺序依次发音。
下面是一个简单的示例代码实现上述自动化操作:
```python
import uiautomator2 as u2
# 连接手机
d = u2.connect()
# 启动app
d.app_start('com.gamestar.perfectpiano')
# 获取键盘坐标
hierarchy = d.dump_hierarchy()
keys = {}
for node in hierarchy.iter():
if node.attrib.get('resource-id') == 'com.gamestar.perfectpiano:id/pianoKeyboard':
for child in node.iter():
if child.attrib.get('class') == 'android.widget.ImageView' and child.attrib.get('clickable') == 'true':
key = child.attrib.get('content-desc')
x, y = child.attrib.get('bounds').replace('[', '').replace(']', '').split(',')[0:2]
keys[key] = (int(x), int(y))
break
# 实现按键操作
for note in ['A0', 'A#0', 'B0', 'C1', 'C#1', 'D1', 'D#1', 'E1', 'F1', 'F#1', 'G1', 'G#1',
'A1', 'A#1', 'B1', 'C2', 'C#2', 'D2', 'D#2', 'E2', 'F2', 'F#2', 'G2', 'G#2',
'A2', 'A#2', 'B2', 'C3', 'C#3', 'D3', 'D#3', 'E3', 'F3', 'F#3', 'G3', 'G#3',
'A3', 'A#3', 'B3', 'C4', 'C#4', 'D4', 'D#4', 'E4', 'F4', 'F#4', 'G4', 'G#4',
'A4', 'A#4', 'B4', 'C5', 'C#5', 'D5', 'D#5', 'E5', 'F5', 'F#5', 'G5', 'G#5',
'A5', 'A#5', 'B5', 'C6', 'C#6', 'D6', 'D#6', 'E6', 'F6', 'F#6', 'G6', 'G#6',
'A6', 'A#6', 'B6', 'C7', 'C#7', 'D7', 'D#7', 'E7', 'F7', 'F#7', 'G7', 'G#7',
'A7', 'A#7', 'B7', 'C8']:
d.click(keys[note])
```
以上二个问答,ChatGPT完美地给出比较正确的答案,按照它的指引和编程方案和示例提示,非常有助于我的具体编程。我仍然需要得到一个关于遇到需要同时几个发出几个不同音符的,各个音符同时发音,不同音长度时间控制问题,我知道需要用到定时中断,或者是多声部编程问题。
因此我又提出第三个问题:
我要让手机“完美钢琴”app,通过python自动化编程控制手机“完美钢琴”如何实现多声部发音?比如需要引入多线程模块?
ChatGPT的第三个答案:
要实现多声部发音,可以使用多线程来实现。可以将每个声部的音符分配到不同的线程中,让它们并发执行,以实现多声部同时发音的效果。
以下是一个使用多线程实现多声部发音的示例代码:
```python
import threading
import time
import random
from perfectpiano import PerfectPiano # 导入完美钢琴模块
piano = PerfectPiano() # 创建完美钢琴实例
# 定义一个线程类,用于播放音符
class NoteThread(threading.Thread):
def __init__(self, notes):
super().__init__()
self.notes = notes
def run(self):
for note in self.notes:
piano.tap(note) # 播放音符
time.sleep(random.uniform(0.2, 0.5)) # 休眠一段时间,模拟弹奏效果
# 定义多个声部的音符序列
part1 = ['C4', 'E4', 'G4', 'C5']
part2 = ['A3', 'C4', 'E4', 'G4']
part3 = ['F3', 'A3', 'C4', 'E4']
part4 = ['D3', 'F3', 'A3', 'C4']
# 创建多个线程来播放不同的声部
threads = [
NoteThread(part1),
NoteThread(part2),
NoteThread(part3),
NoteThread(part4)
]
# 启动线程
for t in threads:
t.start()
# 等待所有线程执行完毕
for t in threads:
t.join()
```
这个示例代码使用了多个 `NoteThread` 线程来分别播放不同声部的音符。每个线程都继承自 `threading.Thread` 类,实现了 `run` 方法来执行音符的播放。在执行 `run` 方法时,每个线程依次播放它所负责的声部的音符序列,通过调用完美钢琴实例的 `tap` 方法来播放音符,然后休眠一段时间,以模拟弹奏效果。最后,启动所有线程,让它们并发执行,等待所有线程执行完毕后,程序结束。
感谢ChatGPT帮我等乡下人玩数码提供的帮助,有兴趣可以去B站,听听ChatGPT协助我编程的演奏的三部曲:二部《故乡的亲人》,和一部缩减版《孤勇者》。
【ChatGPT如何帮我编程之一:手机钢琴《故乡的亲人》-完美钢琴-哔哩哔哩】 https://b23.tv/HFxRVKL