我是一个音乐团体的成员,其主要元素之一是弯针。但是,这个(rc300老板)有一些错误。我们有一个非常特殊的用途,尝试了其他踏板之后,我们找不到真正适合的踏板(midi同步问题,不适合我们的循环启动行为)。
所以我开始用python编写一个小的原型,虽然我知道这不是最快的语言,但是我是最了解的一种语言,所以对于原型设计,我认为这很好,而且它有许多文档齐全的库可供操作声音,midi信号等。我得到了一些基本但最终的结果,一个多轨和多回路循环器,工作时没有太多延迟。
我现在想创建一个允许用户远程控制某些参数或仅查看信息的界面。我受到数字调音台当前正在做的事情的启发,可以通过平板电脑通过网络浏览器对其进行控制。显然,这将不会用于启动录制或回放会话,这些事件可以通过Midi踏板控制。
因此,我想设置一个Websocket服务器,允许我操纵程序数据。那就是它变得复杂的地方。
对于该示例,我已将程序减少到最少。设定速度的时钟。可以通过websocket操纵的速度如下图所示:
我将uvicorn放入一个进程中,因为它的执行被阻止了。但是,我一般都没有python或开发方面的高级技能,因此我不得不处理变量共享的问题。
总结一下:
1 /我有一个类/线程Clock
-它针对名为TEMPO
的变量创建音频点击。
-此类具有rise_tempo()
和reduce_tempo()
方法,当从main()
调用时,它们可以很好地工作。
2 /我有一个运行uvicorn的run_server进程。 -它打开了一个网络套接字,并接收或发送信息。
我在主循环中实例化时钟(clock=Clock()
)和run_server
:
但是,当我从clock
进程调用run_server
对象方法时,它们不起作用。我猜这是因为clock
对象在流程中未共享。
所有示例代码都在以下gitlab存储库中:https://gitlab.com/emmanuel.kormann/clock_example
这里有一些摘录:
TEMPO = 60
class Clock(Thread):
[...]
def rise_tempo(self):
global TEMPO
TEMPO = TEMPO + 10
self.build_sample()
def reduce_tempo(self):
global TEMPO
TEMPO = TEMPO - 10
self.build_sample()
def run(self):
[...]
clock = Clock()
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
if data == '+':
clock.rise_tempo()
await websocket.send_text(f"Message text was: {TEMPO}")
def run_server():
uvicorn.run(app, host='127.0.0.1', port=8000)
def main():
proc = Process(target=run_server, args=(), daemon=True)
proc.start()
clock.start()
我应该采用哪种架构来实现自己的目标?