计算 iOS 的 CoreMIDI 弯音值?

2023-12-01

我需要手工组装14位MIDI 弯音来自 iOS 中原始 UInt16 值的值。我想知道是否有人有机会提出一个优雅的解决方案?这就是我现在的情况 - 我可能会在今天晚些时候有机会对此进行测试,但如果我在那之前收到回复,那就太好了:

首先,为好奇的人提供一些 MIDI 预备知识。

MIDI 弯音被分解为一个状态字节,然后是two数据字节(它是一个 14 位控制器),这两个数据字节通过均以零状态与其状态字节相关联bit, MIDI Spec 让它们按照 MSB -> LSB 的顺序出现

(编辑:更新,实际上是Status -> LSB -> MSB )

(即 1110 0000、0111 1111、0111 1111)

挑战在于如何在 iOS 上将 ARM/Intel 16 位 UInt16 分解为两个 7 位段,并且它对 MIDI 有意义吗?

请记住,因为我们处理的是无符号整数,所以 0 值不是中性弯音,而是全音低 - 其中中性弯音定义为 8192 - 而 16,383 是全音高。

所以这是我对如何做到这一点的最佳猜测:

UInt16 msbAnd = base10ValueUInt16 & 16256; //clearing out LSB 
UInt16 msbAndShift = msbAnd << 1; //shift into leading Byte, with 0 status bit

UInt16 lsbAnd = base10ValueUInt16 & 127; //isolating LSB
UInt16 finalTwoBytePitchWord = msbFinalAndShift | lsbAnd; //make UInt16 word

UInt16 finalTwoBytePitchWordFlipped = CFSwapInt16HostToBig(finalTwoBytePitchWord); //Endian tweak

这段代码运行良好,似乎创建了两个具有所需零状态位的数据字节,并从小端 Intel/ARM 翻转它们,这似乎对于 MIDI 是必要的(MIDI 是 STATUS -> MSB -> LSB ):我可以拍拍稍后在适当的 MIDI 通道的前导状态字节上。

那么,这有意义吗?有人想出更优雅的解决方案吗? (是否有我正在忽略的图书馆?)...我稍后会回来查看,并让人们知道这是否真的适用于我必须瞄准的采样器。

Thanks


我认为您的代码接近正确,但过于复杂。这个问题与 iOS、字节顺序、ARM 或 Intel 无关;这只是普通的老式 C 代码而已。如果你正确编写代码,它将运行任何合理的平台无需修改。你不需要图书馆;只需几行代码。

最好逐字节地使用 MIDI。您需要一个函数,它接受一个 16 位无符号整数(我们相信它最多有 14 位值)并返回两个单字节值,一个具有最高有效位,一个具有最低有效位。

稍后,当您发送消息时,您将按照适当的顺序组装字节。根据规格,俯仰轮消息由三个字节组成:STATUS,然后是 LSB,然后是 MSB。你的问题把它们搞反了!

最低有效 7 位很简单:只需从原始值中屏蔽掉这些位即可。最重要的 7 位类似:从原始值中屏蔽掉接下来的较高 7 位,然后将它们向下移动。

16 位整数在计算机内存中是小端还是大端并不重要;编译器会处理这个问题。

这是一个函数和一个测试工具。

#include <stdio.h>
#include <stdint.h>  // for C standard uint8_t and uint16_t
// or, if you prefer, use unsigned char and unsigned short, or Byte and UInt16;
// they'll all work, although some are more portable than others

void encode14BitValue(uint16_t value, uint8_t *out_msb, uint8_t *out_lsb)
{
    uint16_t mask = 0x007F;  // low 7 bits on
                             // "(1 << 7) - 1" is arguably clearer
    *out_lsb = value & mask;
    *out_msb = (value & (mask << 7)) >> 7;
}

int main(int argc, const char * argv[])
{
    typedef struct {
        uint16_t in;
        uint8_t expected_msb;
        uint8_t expected_lsb;
    } test_case;

    test_case cases[] = {
        { 0x0000, 0x00, 0x00 },
        { 0x0001, 0x00, 0x01 },
        { 0x0002, 0x00, 0x02 },
        { 0x0004, 0x00, 0x04 },
        { 0x0008, 0x00, 0x08 },
        { 0x0009, 0x00, 0x09 },
        { 0x000F, 0x00, 0x0F },
        { 0x0010, 0x00, 0x10 },
        { 0x0011, 0x00, 0x11 },
        { 0x001F, 0x00, 0x1F },
        { 0x0020, 0x00, 0x20 },
        { 0x0040, 0x00, 0x40 },
        { 0x0070, 0x00, 0x70 },
        { 0x007F, 0x00, 0x7F },
        { 0x0080, 0x01, 0x00 },
        { 0x0081, 0x01, 0x01 },
        { 0x008F, 0x01, 0x0F },
        { 0x0090, 0x01, 0x10 },
        { 0x00FF, 0x01, 0x7F },
        { 0x0100, 0x02, 0x00 },
        { 0x0200, 0x04, 0x00 },
        { 0x0400, 0x08, 0x00 },
        { 0x0800, 0x10, 0x00 },
        { 0x1000, 0x20, 0x00 },
        { 0x1FFF, 0x3F, 0x7F },
        { 0x2000, 0x40, 0x00 },
        { 0x2001, 0x40, 0x01 },
        { 0x3FFF, 0x7F, 0x7F },
    };

    int passed = 1;
    for (int i = 0, c = sizeof(cases) / sizeof(cases[0]); i < c; i++) {
        uint8_t msb, lsb;
        encode14BitValue(cases[i].in, &msb, &lsb);

        if (cases[i].expected_msb != msb || cases[i].expected_lsb != lsb) {
            printf("failed: 0x%04hX expected 0x%02hhX 0x%02hhX got 0x%02hhX 0x%02hhX\n", cases[i].in, cases[i].expected_msb, cases[i].expected_lsb, msb, lsb);
            passed = 0;
        }
    }

    return passed ? 0 : 1;
}

在您的代码中,尝试将两个字节的结果打包为一个 16 位整数只会增加混乱。我不知道你为什么要这样做,因为每当你将 MIDI 发送到其他地方时,你都必须再次提取单个字节。这就是对字节顺序的担忧,因为您的打包和解包代码必须一致。你不妨别打扰。我敢打赌你的代码是不正确的,但你交换 MSB 和 LSB 的错误弥补了它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 iOS 的 CoreMIDI 弯音值? 的相关文章

  • 以弯曲格式显示文本

    我正在寻找以曲线格式绘制一些文本 我使用哪个控件并不重要 UITextField UILabel or UITextView 我只想显示如图所示的文本 仍在寻找解决方案 请帮忙 查看此链接 https nodeload github com
  • ios 在后台处理推送通知

    我想保存应用程序处于后台状态时到达的推送通知 我知道关于 void application UIApplication application didReceiveRemoteNotification NSDictionary userIn
  • 可以获取位置,但无法获取航向

    我目前只使用模拟器 但我在 iOS 模拟器上快速使用 CoreLocation 时遇到问题 我得到此代码打印的位置更新 但从未得到标题 我不想当然 我正在尝试制作一个指南针类型的应用程序 它将显示目标的方位 class CompassVie
  • 在视图之间传递核心数据实体变量

    我无法理解如何在视图之间使用核心数据实体变量 为了更好地理解我的问题是什么 我的代码如下 View A 基本上 您必须将完整预算实体或相关预算实体的 ID 从视图 A 传递到视图 B 由于不知道您的应用程序的视图层次结构和逻辑 我假设您选择
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • ios - 在哪里放置 s.static_framework = true

    我在 CocoaPods 中的级别为 0 当我使用pod install有一个错误说 The Pods App target has transitive dependencies that include static framework
  • iOS 视图控制器内存在被关闭后未释放

    当用户单击按钮时 它会显示一个带有两个视图控制器的新选项卡栏视图控制器 我是这样做的 ACLevelDownloadController dvc ACLevelDownloadController alloc initWithNibName
  • 在 HTML5 iOS 7 / iOS 8 中显示十进制键盘

    经过几个小时的搜索后 我只是有一个简单的问题 是否有可能在网络浏览器输入字段中显示小数键盘 input type number 只显示数字 但我需要在左下角使用逗号或点 我尝试过任何事情 pattern step等等 但没有显示十进制键盘
  • ios7 navigationController PushViewController 动画错误

    看来我在 navigationController PushViewController 方法中发现了一个错误 为了重新创建它 我采用了示例主详细信息项目并对 didSelectRow method void tableView UITab
  • 在 iOS 上使用 Web 服务的最佳方式?

    我想构建一个 iOS 应用程序 让您登录到网络服务 之后 应用程序将 当用户选择时 通过 https 发送登录名 密码以及请求的变量 例如 在请求 新闻更新 后 它将收到 XML 格式的请求信息 类似于
  • 为什么在授予用户权限时,UIUserNotificationType.None 在当前设置中返回 true?

    我正在编写一种方法来检查当前用户设置是否包含某些通知类型 当检查当前设置是否包含 UIUserNotificationsType None 时 无论授予权限还是拒绝权限 它都会返回 true 有谁知道这是为什么吗 func register
  • Swift Codable 将空 json 解码为 nil 或空对象

    这是我的代码 class LoginUserResponse Codable var result String var data LoginUserResponseData var mess String public class Log
  • 添加自定义过渡会导致 xib 加载错误的屏幕尺寸

    我正在尝试向具有 xib 的 UIViewController 添加自定义过渡 我尝试了几种方法 但它们都有相同的问题 视图显示的屏幕尺寸错误 我当前的示例基于以下教程 使用 Swift 在 iOS 中自定义 UIViewControlle
  • 防止 AlertView 被解雇

    任何人都可以帮助我防止在其按钮单击事件上解雇警报视图吗 我有一个 textview 作为我的alertView 的子视图 如果 textview 值为 nil 我不想关闭它 因为这是一个非常老的问题 但我得到了一个解决方案 并且如果其他开发
  • iOS 循环对象的属性并添加操作

    我有一个具有几个类似属性的类 UISliders 我想添加用户开始和结束使用每个滑块时的操作 每个滑块都将链接到同一个选择器 因此我考虑只是迭代它们 而不是编写 10 个几乎相同的代码块 问题是 最有效的方法是什么 我尝试过这样的事情 在运
  • git 提交错误:检测到大文件

    您好 我正在为 ios 8 1 开发一个应用程序 xcode 我已经使用 googleMaps 框架来实现自动完成功能 当我尝试在 Git 中推送我的项目时 我收到大文件检测错误 后来尝试使用 git lfs 并跟踪 git 检测到的文件
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged
  • 在故事板中的视图控制器之间滑动手势

    我希望添加左右滑动手势来在视图控制器之间进行更改 这是否可能 并且有没有一种简单的方法可以在故事板中执行此操作 谢谢 故事板允许您在两个视图控制器之间设置 Segues 我想说首先在视图之间附加 Segues 给它一个标识符 然后使用类似的
  • 分发内部业务 IOS 应用程序

    我遇到了 IOS 应用程序分发的一个令人困惑的部分 因此 我需要简单细分一下我的限制 即仅将我的应用程序分发给我的员工 同事或任何被视为 内部 的人 这是表明我不希望该应用程序出现在应用程序商店中的另一种方式 我的情况是我为几家公司开发 他
  • 为什么使用 iPhone 或 iOS 设备在“iframe”中查看“position:fixed”时不起作用?

    我研究过 stackoverflow 似乎position fixed在 iOS 移动设备的 iframe 中 https stackoverflow com questions 15874910 position fixed and if

随机推荐

  • 如何使用Python请求登录网站,存储cookie,然后访问网站上的另一个页面?

    我正在尝试使用 Python 脚本登录网站 存储我收到的 cookie 然后使用相同的 cookie 访问网站的会员专用部分 我已经阅读了有关该主题的几篇文章和答案 但没有一个答案对我有用 以下是我尝试访问的网站登录页面的 HTML 代码
  • 子/函数数组参数已更改

    我有一个带有字符串数组作为参数的 Sub Private Sub des ByVal array As String Dim i As Integer For i 0 To UBound array array i hy Next End
  • manim 中的孟加拉语单词打印完全错误

    我一直在尝试使用 Manim 为孟加拉语角色制作动画 我用了这个方法在 Manim 中使用电脑字体 一切似乎都运行良好 直到我看到输出 例如 如果我写 我得到的输出为 仔细查看输出 大多数时候它会吐出毫无意义的词语 使用的代码是 class
  • PHP PDO:SQLSTATE[HY000] [2002] 连接被拒绝

    我遇到了 PHP 数据对象的问题 我无法连接到我的数据库 首先这是我的 PHP 脚本
  • 当父级有修饰符时,SCSS + BEM 风格的子级结构

    请问可以为 rounded 内的元素设置 css 吗 我不想使用 box 某些东西 但我需要修改依赖于父修饰符的子项 div class box div class box something Hello div div div class
  • 使用AWS iOS SDK从cloudfront分发中获取文件

    我正在使用适用于 AWS 的最新 iOS SDK 并且使用 TransferManager 类从 S3 获取文件可以正常工作 S3GetObjectRequest request S3GetObjectRequest alloc initW
  • 在 Socket.IO 1.0 中配置超时和传输

    在旧版本的 Socket IO io set transports xhr polling io set close timeout 3 但现在 命令io set已被弃用 我如何定义close timeout and transports
  • Bing 地图 GetRoute 给出“0x8004231C”错误

    我试图在 bing 地图上显示从点到点的路线 在真实设备上测试 我已经输入了 2 个航路点 地理坐标 并且我正在尝试使用以下命令通过 Windows PhoneToolKit 获取路线await query GetRouteAsync 不幸
  • 强制乘法使用 __rmul__() 而不是 Numpy 数组 __mul__() 或绕过广播

    这个问题与中提出的问题很接近用你班级的 mul 覆盖其他 rmul 但我的印象是 这是一个比数值数据更普遍的问题 这也没有得到解答 我真的不想使用矩阵乘法 对于此操作 因此 问题 我确实有一个接受标量和数值数组相乘的对象 像往常一样 左乘法
  • Android 自定义日历和提醒[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我的应用程序将包含一个自定义日历 并且根据此日历用户可以创建事件和提醒 问题是 是否可以在 android 中创建自定义日历 我的意思是我想在我的日历中创建事件 这些事件不会出现
  • javascript回调函数,变量映射

    我一直在javascript中使用回调函数 但我从来不明白回调如何知道它可以接受哪些变量 让我们看下面的示例代码 var friends Mike Stacy Andy Rick friends forEach function name
  • 我是否必须修复最新 nuxt.js 的审核问题?

    我正在尝试在我的应用程序中使用 nuxt 但是当我运行 yarn 审计 时 存在一些审计问题 这些问题是 nuxt 的依赖项 我必须解决这些审计问题吗 如果必须的话 我该如何解决它 我正在使用 nuxt 2 15 7 并且添加了最新的css
  • GWT 有哪些效果库可用于商业用途?

    我正在寻找一个可以非常非常轻松地放入我现有的 GWT 应用程序的效果库 我想将库添加到我的构建路径中 然后开始编写类似的内容FX fadeOut thisWidget 取代thisWidget setVisible false GWT 是否
  • Spring Data JDBC 使用 Boot 2.3.0 生成错误的 HSQLDB 查询

    我有一个使用 Spring Data JDBC 的 Spring Boot 项目 测试使用 HSQLDB 当我尝试升级到 Spring Boot 2 3 0 时 我的存储库测试开始失败 Spring Data JDBC 现在似乎引用表名和列
  • 如何在 localhost 中通过 node.js 使用 webodf 编辑器

    我没有找到任何关于如何运行 webodf 的教程 我阅读了他的 api 和源代码 我正在了解如何启动它 任何人都可以分享这个想法 WebODF version 0 5 10 8 gf5949f3 Found Java usr bin jav
  • 在php中,二维数组的行数和列数?

    我有一个元素数量未知的二维数组 two darray row column there will be an unknown integer values instead of row and column keywords 如果我要写一个
  • 创建仅包含整数的列表

    我正在尝试创建一个仅包含另一个列表中的整数的列表 假设我的范围列表是 我希望结果显示为 我希望该解决方案仅适用于 Excel 2019 任何帮助将不胜感激 谢谢 如果您有 Office 365 您可以使用 FILTER A1 A6 INT
  • WTForms 错误:TypeError:formdata 应该是多字典类型包装器

    from wtforms import Form BooleanField TextField validators PasswordField class LoginForm Form username TextField Usernam
  • 短代码呈现为文本而不是短代码应有的形式

    我正在建立一个购物网站 我试图在其中添加一个短代码 该代码将向客户显示购买按钮以及客户想要购买的产品数量 在我的帖子页面上 短代码工作正常 http warringah Plastics com au blog dt catalog rec
  • 计算 iOS 的 CoreMIDI 弯音值?

    我需要手工组装14位MIDI 弯音来自 iOS 中原始 UInt16 值的值 我想知道是否有人有机会提出一个优雅的解决方案 这就是我现在的情况 我可能会在今天晚些时候有机会对此进行测试 但如果我在那之前收到回复 那就太好了 首先 为好奇的人