开放声音控制(OSC)是用于计算机,声音合成器和其他多媒体设备之间通信的协议,其针对现代网络技术进行了优化.将OSC与MAX/MSP一起使用是特别常见的 - 这实际上就是我正在做的事情,使用OSC和Python与MAX中的另一个子系统进行通信.
有一堆支持OSC的python模块.大.他们都声称自己简单,实用,完美.面临主观领域的风险,您的经验建议用于以下模块的用例是什么?
我想一个简单的实现对我来说是最好的,因为我对OSC只有一点了解.我正在使用Python 2.7.
我试图弄清楚这些消息包含哪些信息正在通过OSC流式传输.消息存储在ArrayList中.这是代码:
public void OSCMessageReceived(OSC.NET.OSCMessage message){
string address = message.Address;
ArrayList args = message.Values;
}
Run Code Online (Sandbox Code Playgroud)
如何遍历arrayList args的值以输出其内容?
我打算定义类似于Open Sound Control的协议,但有点不同.
这个想法很复杂,我不会在这里描述它.
假设我要使用libev和主题行中的一个工具来实现OSC库.
一个人会推荐什么,为什么?
Ragel看起来很诱人,虽然ANTLR也可能是正确的.然而,坚持传统的UNIX东西也是一个好主意(即lex/yacc).
此外,我最感兴趣的是最适合嵌入式平台 (比如运行Linux的200MHz ARM芯片).
我试图根据需要详细描述我正在构建的应用程序,所以我提前为这篇文章道歉!
我正在使用C++ Juce框架设计和构建一个相当大的音乐应用程序,简而言之就是接收OSC消息并将它们转换为音频和MIDI数据.该应用程序有三个"模式",每个模式定义OSC消息将产生什么样的声音.用户可以应用模式和另一组模式设置来定义每个OSC消息"触发"的声音.
下面是程序的类关系和层次结构的基本框图概述,或者至少是我在理论上想象它的方式.为了阐明Juce术语,"Component"类基本上是一个GUI对象/类,它在屏幕上显示内容并允许用户交互.
基本框图http://liamlacey.web44.net/images/Software_block_diagram.jpg
我是一位经验丰富的C程序员,但我对C++和OOP设计还不熟悉.我最了解它是否很好,但我遇到的主要问题是在构造所有类以获得正确的关系和层次结构方面,以便它们都可以正常通信,以便应用程序执行它需要做的事情.
以下是每个课程的简要说明:
OscInput - 此基类使用oscpack库来侦听OSC消息.只有一个类可以从此基类继承,因为如果同一UDP端口上有多个侦听器,应用程序将崩溃.
Main - 申请启动.从OscInput继承,以便每次收到OSC消息时,都会在此类中调用回调函数
MainWindow - 应用程序主文档窗口 - 默认为Juce应用程序.
MainComponent - 应用程序的主要/后台组件/ GUI - 默认为Juce应用程序.
Mode1Component/ Mode2Component/ Mode3Component-每个组件类的单个实例被调用并从MainComponent其用于由用户改变的每个OSC消息做什么的设置显示.
SubComponent1 - 从MainComponent调用并显示此组件类的单个实例.
SubComponent2 - 从SubComponent1调用并显示此组件类的48个实例.每个实例用于显示正在接收的不同OSC消息的值.
Mode1/Mode2/Mode3 - 从Main调用每个类的单个实例.每个类用于根据Settings类中的值/变量将OSC消息实际转换为音频或MIDI数据.
Settings - 此类的单个实例,用于存储控制从每个不同OSC消息生成的声音的设置.
我很高兴我将所有组件/ GUI类布局并以正确的方式连接.我也收到了传入的OSC消息.但是我不太确定如何实现Settings类实例的关系.以下是我需要帮助的关系:
因此,我有以下问题:
应该Settings从哪里调用类实例,以便上面提到的所有相关类实例都能与之通信?我只想要这个类的单个实例需要被许多其他类访问,所以它应该是全局,单例还是静态类?我一直在研究Singleton设计模式,这似乎是我正在寻找的,但我得到的印象是我应该避免它,如果我可以考虑替代方法.
它应该Main是侦听OSC消息的类吗?如何让SubComponent2接收OSC消息以及Mode1,Mode2和Mode3类实例?
是否应该从Main调用功能类(Mode1,Mode2和Mode3)?我正在努力保持所有功能和GUI代码分离,因为我正在处理GUI编程,而我正在处理应用程序的功能编程.
任何人都可以发现我的程序设计模式中的任何重大缺陷吗?
任何帮助将不胜感激!
谢谢
我试图通过fluxus获得一些乐趣,但它的手册和在线文档似乎都假设读者已经是一位从未听说过Scheme的专家网络程序员.因此,您会获得试图解释前缀表示法基础知识的段落,但假设您知道如何将声卡数据传输到程序中,或者设置并连接到OSC进程.
那里有没有相反的教程吗?IE,假设您已经掌握了Lisp/Scheme的功能,但在正确设置声源或OSC服务器之前需要一些指针?
除此之外,有没有人知道如何获得(例如)连接到(fluxus)的系统麦克风,或者如何让它从磁盘播放声音文件?
我正在尝试接收通过OSC从Pure Data(或Max/MSP)发送到MATLAB的消息.
这是我从MATLAB发送消息的代码(我使用的是oscmex协议):
host = 'localhost'; % local host UDP address
sendPort = 3333; % UDP port number to send over
receivePort = 3333; % UDP port number to receive from
oscAddress = osc_new_address(host, sendPort); % open send address
oscServer = osc_new_server(receivePort); % open server
dataPacket = struct('path','/foo','tt','f','data',{num2cell([1.0])}); % create packet
osc_send(oscAddress, dataPacket); % write packet to OSC
oscMessage = osc_recv(oscServer, 0.1); % listen for packet on OSC
% check to see if anything is …Run Code Online (Sandbox Code Playgroud) 当播放(触发)音频或 MIDI 剪辑时,需要使用 OSC 将其名称发送到另一个应用程序。
LiveAPI是一个接口,允许人们使用 python 脚本探索和自动化Ableton Live。
执行此操作的代码必须用 python 脚本编写,该脚本必须放置在 Ableton Live 可以找到它的特定文件夹中,在 Live 的首选项中选择。
有关 LiveAPI 的更多信息,请访问以下网站:
http://www.assembla.com/wiki/show/live-api
http://groups.google.com/group/liveapi
我想学习如何编写最简单的服务器/客户端C ++命令行应用程序,以使用OSC(开放式声音控制)从一个应用程序实时向另一应用程序发送几行数据。我想使其在本地主机模式下或通过网络工作,但我认为在OSC中,它只是指定IP地址的问题。
我对OSC一无所知,官方页面似乎有点含糊。在此页面上说:
CNMAT的用于构造OSC数据包的开源库:如果您希望您的应用程序能够格式化OSC数据包以通过网络发送,那么这就是您所需要的。 http://archive.cnmat.berkeley.edu/OpenSoundControl/src/libOSC/
但这只是2003-2004年的几个文件,绝对不是我打算用于学习OSC的文件。然后介绍OSC控制套件,但在另一页上说OSC控制套件已过时,强烈建议您不要使用控制套件。
也许这是最好的页面:http : //opensoundcontrol.org/guide-osc-libraries列出了库并给出了一些意见,但是我仍然不知道应该从4中选择哪个库。
我想学习/使用的是一个简单的,跨平台的,受广泛支持的库,我可以在Visual C ++ 2010中使用该库来构建命令行应用程序。你有什么建议?您可以使用该库编写或链接教程吗?
我使用外部库来处理 2 个应用程序之间的 udp (OSC) 通信。为了格式化将要发送的消息,库需要一个 char* 但我从 UI 中得到一个必须转换的字符串。
当我处理代码的其他部分时,udp 部分是这样硬编码的:
char* endofMess = "from setEndMess";
Run Code Online (Sandbox Code Playgroud)
并且工作正常。我认为让它与我的字符串一起工作很容易并写道:
std::string s = "from setEndMess";
char* endofMess = const_cast<char*>(s.c_str());
Run Code Online (Sandbox Code Playgroud)
但与第一个例子不同的是,我收到的消息格式正确,现在我只收到乱码。有人知道它可能来自哪里吗?
谢谢!
马修
编辑:我使用的代码:每次 OSCVal 更改时发送消息的方法:
void osc500::testOSC(int identifier, float OSCval)
{
UdpTransmitSocket transmitSocket( IpEndpointName( destIP, port ) );
char buffer[1024];
osc::OutboundPacketStream p( buffer, 1024 );
p << osc::BeginBundleImmediate
<< osc::BeginMessage( endofMess )
<< OSCval << osc::EndMessage
<< osc::EndBundle;
transmitSocket.Send( p.Data(), p.Size() );
}
Run Code Online (Sandbox Code Playgroud)
如果我必须改变 OSC 模式,我称之为:
void osc500::setEndMess(String endpattern){
// endofMess = …Run Code Online (Sandbox Code Playgroud)