标签: coremidi

使用MusicPlayer和Music Sequence播放midi文件

我使用以下代码成功地让iOS使用soundfont示例播放.mid(midi)文件:

-(void) playMusic:(NSString*) name
{
    NSString *presetURLPath = [[NSBundle mainBundle] pathForResource:@"GortsMiniPianoJ1" ofType:@"SF2"];
    NSURL * presetURL = [NSURL fileURLWithPath:presetURLPath]; 
    [self loadFromDLSOrSoundFont: (NSURL *)presetURL withPatch: (int)3];

    NSString *midiFilePath = [[NSBundle mainBundle] pathForResource:name ofType:@"mid"];
    NSURL * midiFileURL = [NSURL fileURLWithPath:midiFilePath];

    NewMusicPlayer(&musicPlayer);

    if (NewMusicSequence(&musicSequence) != noErr) 
    {
        [NSException raise:@"play" format:@"Can't create MusicSequence"];  
    }

    if(MusicSequenceFileLoad(musicSequence, (CFURLRef)midiFileURL, 0, 0 != noErr)) 
    {
        [NSException raise:@"play" format:@"Can't load MusicSequence"];
    }

    MusicPlayerSetSequence(musicPlayer, musicSequence);
    MusicSequenceSetAUGraph(musicSequence, _processingGraph);
    MusicPlayerPreroll(musicPlayer);
    MusicPlayerStart(musicPlayer);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在第一个文件仍在播放时尝试播放第二个文件时出现问题.

我尝试了很多变化.首先,上面的代码将同时播放两个轨道.或者,我尝试过:

DisposeMusicPlayer(musicPlayer);
DisposeMusicSequence(musicSequence);
Run Code Online (Sandbox Code Playgroud)

之前NewMusicPlayer(&musicPlayer),但这会产生一个奇怪版本的曲调,只播放零星的音符.

我很乐意简单地调用这种方法,然后播放下一首曲目.

midi objective-c audio-player ios coremidi

5
推荐指数
1
解决办法
5598
查看次数

使用CoreMIDI在Mac上发送稳定的Midi时钟

我正在开发一个小程序,用于将抖动的MIDI时钟“转换”为稳定的拍子。抖动的MIDI时钟会产生可怕的颤音。

这个想法是“监听”传入的Midi时钟,并在确定速度后将稳定的MIDI时钟发送到虚拟IAC设备,以便我可以将DAW​​(NI机器)同步到同一IAC设备。传入的MIDI来自Korg Electribe,所以我被固定在MIDI电缆上。我正在使用Komplete Audio 6接收MIDI时钟。

第一部分(侦听并确定速度)已经介绍,但是现在我必须为该速度生成稳定的时钟。

我试图使用高优先级的线程发送midi时钟。下面的测试例程使我在119.8和120.2之间有速度抖动。

我在此例行程序中做错了什么还是应该使用注释策略?任何帮助都非常感谢。

问候,罗布

dispatch_source_t CreateDispatchTimer(uint64_t interval,
                                  uint64_t leeway,
                                  dispatch_queue_t queue,
                                  dispatch_block_t block)
{
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,
                                                     0, 0, queue);
    if (timer)
    {
        dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, interval, leeway);
        dispatch_source_set_event_handler(timer, block);
        dispatch_resume(timer);
    }
    return timer;
}

- (void) testTimer{

    IAC = MIDIGetDestination(0); // 0 is the MAC IAC device on my system
    MIDIPacket       pkt;
    MIDIPacketList   l;
    pkt.timeStamp = 0;
    pkt.length = 1;
    pkt.data[0] = 0xF8;

    l.numPackets = 1;
    l.packet[0] = pkt;

    dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); …
Run Code Online (Sandbox Code Playgroud)

macos midi-interface coremidi

5
推荐指数
0
解决办法
891
查看次数

iOS中的MIDI合成行为不正确WRT俯仰弯曲:LSB被忽略

Apple的MIDI合成代码中有一个严重的错误,或者我做错了什么.这是我对它的理解.当您发送弯音MIDI命令时,弯曲的范围是-8192到8191,转换为0.(所以实际范围是0到16383.)这个数字被分成两个7位字段,所以真的这意味着你有128个粗控制值和128个精细控制值.

这是我写的弯音样本,类似于Apple的LoadPresetDemo中的命令.

// 'ratio' is the % amount to bend in current pitch range, from -1.0 to 1.0
// 'note' is the MIDI note to bend

NSUInteger bendValue = 8191 + 1 + (8191 * ratio);
NSUInteger bendMSB = (bendValue >> 7) & 0x7F;
NSUInteger bendLSB = bendValue & 0x7F;

UInt32 noteNum = note;
UInt32 noteCommand = kMIDIMessage_PitchBend << 4 | 0;

OSStatus result = MusicDeviceMIDIEvent(self.samplerUnit, noteCommand, noteNum, bendMSB, bendLSB);
Run Code Online (Sandbox Code Playgroud)

当弯曲MSB(粗调)改变时,音高弯曲得很好.但是当bendLSB(精细控制)改变时,没有任何反应.换句话说,似乎Apple的MIDI合成器忽略了LSB,这意味着音符仅在丑陋的离散块中弯曲.

这是另一种做同样事情的方式:

// 'ratio' is the % amount …
Run Code Online (Sandbox Code Playgroud)

midi core-audio audiounit ios coremidi

4
推荐指数
1
解决办法
1183
查看次数

如何动态更改MIDI TEMPO?[CoreMIDI] iOS

我有一个带有MIDI音符的MusicTrack设置成一个MusicSequence,用MusicPlayer播放.当我试图通过使用来调整速度时出现问题;

MusicTrackNewExtendedTempoEvent(musicTrack,0.0,newBPM);

显然这应该改变正在播放的MusicTrack中的TempoEvent,但事实并非如此.知道为什么会发生这种情况吗?

midi objective-c ios coremidi

4
推荐指数
1
解决办法
673
查看次数

我想使用我的 Midi 钢琴与我的 Windows 窗体 C# (DryWetMidi) 交互

我正在 Visual Studio 中开发一个小软件(C# 中的 Windows Form . NET)。我制作了一个简单的钢琴,当我按下一些键盘按钮(QWERTY)时,它会改变琴键的颜色

在此输入图像描述

现在我想用我的 MIDI 钢琴来完成这个活动。在我的实际代码中,我使用了 KeyDown(在原始钢琴键上显示钢琴键的彩色图像)和 KeyUp(隐藏它)来执行此事件,并且我知道使用 MIDI 钢琴执行此操作会比这。

我在这里找到了DryWetMidi API(由 Melanchall 提供)(我使用 NuGet 下载了它,并将其应用到我的项目中),它可以使用 MIDI 完成很多重要的事情,但我只想做这些简单的事情:

  1. 识别 Windows 识别的 MIDI 设备。

  2. 让用户在“设置表单”中选择他的 MIDI 设备(我已经在空白中)

  3. 可以弹奏MIDI钢琴,激活“变色事件”

  4. (不需要识别速度)

  5. (不需要播放MIDI文件)

  6. (不需要发声,因为我打算和虚拟乐器软件同时使用)

DryWetMidi 文档说“设置事件接收非常容易”:

using System;
using Melanchall.DryWetMidi.Devices;
using Melanchall.DryWetMidi.Core;

// ...

using (var inputDevice = InputDevice.GetByName("MIDI Device"))
{
    inputDevice.EventReceived += OnEventReceived;
    inputDevice.StartEventsListening();
}

// ...

private void OnEventReceived(object sender, MidiEventReceivedEventArgs e)
{
    MidiDevice midiDevice = (MidiDevice)sender;
    MidiEvent midiEvent = e.Event;
    Console.WriteLine($"Event received from …
Run Code Online (Sandbox Code Playgroud)

c# midi winforms coremidi

4
推荐指数
1
解决办法
1482
查看次数

如何在iOS中发送和接收网络MIDI数据?

如何在iOS中发送和接收网络MIDI数据?我能够使用bonjour解析服务器并将服务应用于MIDI连接,但我不知道从那里去哪里.文档似乎缺乏,网上的信息也不多.

midi bonjour objective-c ios coremidi

3
推荐指数
1
解决办法
1441
查看次数

CoreAudio:Ausampler Unit复音

我目前正在努力有效地使用Ausampler Unit.我使用了apple示例中的代码:https://developer.apple.com/library/ios/#samplecode/LoadPresetDemo/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011214-Intro-DontLinkElementID_2

缺点似乎是它会立即停止一个音符/样本,如果相同的音符再次出现.因此,如果我发送带有长号预设的midi音符60.然后在拿着这个的时候,我又发了一张纸条60.它切断了第一个音符事件.有没有人知道是否/如何能够持有每一个音符直到音符关闭事件(这个特定音符)进来?

其他问题:如何在发送后改变音符的音量?例如,我用100速度发送了midi音符60和70.虽然音符60仍然播放,但我想减少音量,但保持音符70.这将被称为midi aftertouch.

希望你能帮忙:)

objective-c core-audio audiounit ios coremidi

3
推荐指数
1
解决办法
2222
查看次数

使用 Swift 和 CoreMIDI 发送和接收 MIDI

我对 Swift/Objective-C 或 Cocoa 环境不是很熟悉,而且我在弄清楚如何使用 CoreMIDI 从 USB 设备发送或收听数据时遇到了很多麻烦。我正在尝试将消息 (144, 36, 5) 发送到我在使用 Bitwig Studio 脚本 API 之前已经完成的 MIDI 控制器(Ableton Push)。除了 Apple 的文档之外,我在这方面找不到太多东西,而且它们对我并没有特别的帮助。到目前为止,我已经想出了如何获取设备列表并查看它们的名称,但除此之外我还是被卡住了。

到目前为止我写的试图发送 MIDI 的内容:

var pushDevice = MIDIGetDevice(2)

var secondEntity = MIDIDeviceGetEntity(pushDevice, 1)

var pushDestination = MIDIEntityGetDestination(secondEntity, 0)

var midiPort = MIDIPortRef()

let myData : [Byte] = [ Byte(144), Byte(36), Byte(5) ]
var packet = UnsafeMutablePointer<MIDIPacket>.alloc(1)
var pkList = UnsafeMutablePointer<MIDIPacketList>.alloc(1)
packet = MIDIPacketListInit(pkList)
packet = MIDIPacketListAdd(pkList, 1024, packet, 0, 3, myData)

MIDISend(midiPort, pushDestination, pkList)
Run Code Online (Sandbox Code Playgroud)

我觉得无法弄清楚这一点有点傻,我想它必须是一个简单的解决方案,但由于某种原因我无法弄清楚。我认为我没有正确构建 MIDIPacketList 或 MIDIPort,而且我不知道如何创建回调和侦听 …

midi cocoa objective-c coremidi swift

3
推荐指数
1
解决办法
5210
查看次数

在 C++ 项目中使用 (OSX) Core MIDI

这是 Core Midi 的(目标 C)文档:https : //developer.apple.com/documentation/coremidi

我怎样才能知道我希望能够在 C++ 项目中使用它?

(我想更根本的问题还在于:?我使用的核心MIDI在C ++项目-但我已经看到了其中的答案似乎是“是” [话又说回来,那些从几年前其他计算器问题... ])

我需要做什么来完成这个设置 - 到我可以开始使用 API 的地步?该文档并没有显示使用了哪些框架,需要哪些头文件等......

那么,入门的步骤是什么?

理想情况下,我希望能够从一个简单的 makefile 进行编译。

c++ macos objective-c coremidi

3
推荐指数
1
解决办法
1380
查看次数

从 Swift 以编程方式打开 MacOS 的 MIDI 蓝牙配置窗格

我可以Audio MIDI Setup像这样以编程方式打开应用程序:

NSWorkspace.shared.launchApplication("Audio MIDI Setup")
Run Code Online (Sandbox Code Playgroud)

但是如何打开Bluetooth Configuration应用程序内的窗口呢?

蓝牙配置窗口

我见过其他应用程序有一个菜单项可以直接打开此对话框。

midi core-audio coremidi core-bluetooth swift

3
推荐指数
1
解决办法
300
查看次数