- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
给定以下代码,如果我使用 if
分支中的第一个方法来获取 MIDIDestination
,代码工作正常,并且 MIDI 数据被发送。如果我使用 else
分支中的第二种方法,则不会发送任何数据。
var client = MIDIClientRef()
var port = MIDIPortRef()
var dest = MIDIEndpointRef()
MIDIClientCreate("jveditor" as CFString, nil, nil, &client)
MIDIOutputPortCreate(client, "output" as CFString, &port)
if false {
dest = MIDIGetDestination(1)
} else {
var device = MIDIGetExternalDevice(0)
var entity = MIDIDeviceGetEntity(device, 0)
dest = MIDIEntityGetDestination(entity, 0)
}
var name: Unmanaged<CFString>?
MIDIObjectGetStringProperty(dest, kMIDIPropertyDisplayName, &name)
print(name?.takeUnretainedValue() as! String)
var gmOn : [UInt8] = [ 0xf0, 0x7e, 0x7f, 0x09, 0x01, 0xf7 ]
var pktlist = MIDIPacketList()
var current = MIDIPacketListInit(&pktlist)
current = MIDIPacketListAdd(&pktlist, MemoryLayout<MIDIPacketList>.stride, current, 0, gmOn.count, &gmOn)
MIDISend(port, dest, &pktlist)
在这两种情况下打印的设备名称都是正确的,并且每次调用的状态都是noErr
。
我注意到,如果我请求 kMIDIManufacturerName
属性,我会得到不同的结果——特别是使用第一种方法,我从 USB MIDI 接口(interface)得到 Generic
MIDI 设备已连接,使用第二种方法,我获得了通过音频 MIDI 设置应用程序配置的 Roland
的值。
我想使用第二种方法的原因是为了过滤掉没有所需制造商名称的设备,但如上所述我无法获得工作输出。
谁能解释这两种方法之间的区别,以及为什么后者不起作用,并最好就我如何解决这个问题提供建议?
最佳答案
听起来您只想找到 MIDI 目标端点以与特定制造商的设备通信。不幸的是,这实际上是不可能的,因为没有用于发现存在哪些 MIDI 设备、它们的属性是什么以及它们如何连接到计算机的协议(protocol)。
(请记住,MIDI 是 1980 年代的原始技术。它甚至不需要双向通信。MIDI 设备有完全有效的 MIDI 设置,您可以向其发送数据,但永远无法从其接收数据,反之亦然。)
计算机知道连接到它的 MIDI 接口(interface)(例如,USB-MIDI 接口(interface))。 CoreMIDI 称这些为“设备”。您可以找出有多少个,每个端口有多少个端口等。但是无法找到有关物理 MIDI 设备(例如连接到它们的键盘和合成器)的任何信息。
“外部设备”是一种绕过发现问题的尝试。当您按下“添加设备”按钮时,它们会出现在音频 MIDI 设置中。就这样!
理想情况下,您的用户会在其设置中为每个物理 MIDI 设备创建一个外部设备,输入每个设备的所有属性,并以完美反射(reflect)其物理 MIDI 电缆的方式设置所有连接。
不幸的是,在现实中:
documentation for MIDIGetDevice()提出了一个很好的建议:
If a client iterates through the devices and entities in the system, it will not ever visit any virtual sources and destinations created by other clients. Also, a device iteration will return devices which are "offline" (were present in the past but are not currently present), while iterations through the system's sources and destinations will not include the endpoints of offline devices.
Thus clients should usually use MIDIGetNumberOfSources, MIDIGetSource, MIDIGetNumberOfDestinations and MIDIGetDestination, rather iterating through devices and entities to locate endpoints.
换句话说:使用 MIDIGetNumberOfDestinations
和 MIDIGetDestination
获取可能的目的地,然后让您的用户选择其中之一。就这样。
如果您真的想做更多:
MIDIEndpointGetEntity
和 MIDIEndpointGetDevice
访问 MIDI 接口(interface)。MIDIObjectGetDataProperty
获取属性值 kMIDIPropertyConnectionUniqueID
,这是连接对象的唯一 ID 的数组。然后使用 MIDIObjectFindByUniqueID
到达对象。 outObjectType
会告诉您它是什么类型的对象。但这很尴尬,您不能保证找到任何有用的信息。
关于swift - 对 CoreMIDI 目的地的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301373/
我在哪里可以从 RFCDES 表中获得 RFCOPTIONS 字符串的描述?每个参数的含义是什么? (H=?,N=?,g=?,l=?, ...) 最佳答案 我认为您应该在交易 sm59 中看到: ht
我在导航组件架构中使用底部导航。我想动态更改第一个 fragment 目标。所以我有 Fragment1 和 Fragment2。我想在某些情况下,单击底部导航栏中的第一项打开 Fragment1,在
有没有使用非硬编码 RFC 目的地的好方法? 现在我们的解决方案是检查使用的是哪个系统,然后将目的地分配给一个变量 IF cl_role EQ 'P'. p_dest = 'ESW300'
我能够使目标沿着屏幕顶部随机生成并在屏幕底部消失。唯一的问题是目标每次只能移动到一个固定点。我希望它们移动到屏幕底部的随机点。有任何想法吗?谢谢。 这是代码: -(void)addTarget{ CC
我有一个列表,其中包含推送 View 的行。该 View 有另一个列表,它推送另一个 View 。原来的List,第一个推送的List会随着数据的变化而更新。但是,推送时最后一个 View 不会更新。
我目前正在致力于将 IBM Webshere 应用程序迁移到 Spring Boot。 作为其中的一部分,有一个 MDB 类需要转换为 @JmsListener。该 MDB 有一个监听多个队列的方法。
我需要使用 phpmailer 发送存储在 mysql 数据库中的多封电子邮件,但是当我想执行它时,它返回 500 页错误,我明白问题出在我在其中输入数据时: ->setTo(["'".$row['e
我正在准备环游世界,并且很想知道世界各地的顶级景点有哪些,因此我正在尝试抓取某个地方的顶级目的地。我想最终到达一个国家的顶级地方以及他们最好的景点。最近添加了 Google Destinations
我想用箭头从当前用户位置旋转 ImageView 到以前保存的某个 GPS 位置。我该怎么做? 从 Location.distanceBetween 方法中获取的 Initial Bearing 是否
我希望能够从 application.properties 设置 @JMSlistener 目标 我的代码是这样的 @Service public class ListenerService {
我有一个 View “B”,它有一个带有参数的初始化程序。 struct B: View { let arg: Int init(arg: Int) { self.ar
好的,我们开始吧。我有一个 cocos2d 应用程序,并且有一些目标朝玩家移动。当玩家移动时,我希望他们再次慢慢地将目的地更改为玩家,这样他们就不会只是移动到空旷的空间中。是否可以更改 Sprite
我正在将 OnDestinationChangedListener 附加到我的 Activity 中的 NavController。 它适用于所有 fragment 目标。但是,当我导航到 Activ
我正在通过制作一个定向的表格对我们的表格进行一些 FK 分析 表示 FK 依赖关系的图,然后遍历 图形。在我的代码中,我使用有向图命名所有内容 术语,但我想多说一点 报告中的“用户友好”。 在这种情况
在 SSIS 包中,我将平面文件中的数据导入数据库,执行 sql 查询并将结果导出到 excel 目的地。我的问题是我有一个 convert,cast 语句,它在 sql 中很好,它返回一个值为 HH
我有一个 Spring 应用程序,它需要查找 JMS 目标才能完成工作。根据我们处于开发环境还是系统测试环境,我们将使用不同的 JMS 实现。 (Oracle AQ在系统测试中使用WebLogic,A
我有一个包含三列(原点、目的地、距离)的矩阵,我想用 Pandas 将其转换为原点/目的地矩阵,有没有一种快速方法(lambda、map)可以在不使用 for 循环的情况下执行此操作? 例如(我拥有的
拥有原始的 websocket 实现: @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocke
自从切换到 Storyboard后,我通过以下方式加载了一个 View Controller [self performSegueWithIdentifier:@"identifier" sender
我有一个名为“detailViewController”的 UIViewController。 使用推送转场通过多个不同的转场访问此 View Controller 。 我面临的问题是 detailV
我是一名优秀的程序员,十分优秀!