我使用以下代码成功地让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时钟“转换”为稳定的拍子。抖动的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) 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音符的MusicTrack设置成一个MusicSequence,用MusicPlayer播放.当我试图通过使用来调整速度时出现问题;
MusicTrackNewExtendedTempoEvent(musicTrack,0.0,newBPM);
显然这应该改变正在播放的MusicTrack中的TempoEvent,但事实并非如此.知道为什么会发生这种情况吗?
我正在 Visual Studio 中开发一个小软件(C# 中的 Windows Form . NET)。我制作了一个简单的钢琴,当我按下一些键盘按钮(QWERTY)时,它会改变琴键的颜色

现在我想用我的 MIDI 钢琴来完成这个活动。在我的实际代码中,我使用了 KeyDown(在原始钢琴键上显示钢琴键的彩色图像)和 KeyUp(隐藏它)来执行此事件,并且我知道使用 MIDI 钢琴执行此操作会比这。
我在这里找到了DryWetMidi API(由 Melanchall 提供)(我使用 NuGet 下载了它,并将其应用到我的项目中),它可以使用 MIDI 完成很多重要的事情,但我只想做这些简单的事情:
识别 Windows 识别的 MIDI 设备。
让用户在“设置表单”中选择他的 MIDI 设备(我已经在空白中)
可以弹奏MIDI钢琴,激活“变色事件”
(不需要识别速度)
(不需要播放MIDI文件)
(不需要发声,因为我打算和虚拟乐器软件同时使用)
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)如何在iOS中发送和接收网络MIDI数据?我能够使用bonjour解析服务器并将服务应用于MIDI连接,但我不知道从那里去哪里.文档似乎缺乏,网上的信息也不多.
我目前正在努力有效地使用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.
希望你能帮忙:)
我对 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,而且我不知道如何创建回调和侦听 …
这是 Core Midi 的(目标 C)文档:https : //developer.apple.com/documentation/coremidi
我怎样才能知道我希望能够在 C++ 项目中使用它?
(我想更根本的问题还在于:灿?我使用的核心MIDI在C ++项目-但我已经看到了其中的答案似乎是“是” [话又说回来,那些从几年前其他计算器问题... ])
我需要做什么来完成这个设置 - 到我可以开始使用 API 的地步?该文档并没有显示使用了哪些框架,需要哪些头文件等......
那么,入门的步骤是什么?
理想情况下,我希望能够从一个简单的 makefile 进行编译。
我可以Audio MIDI Setup像这样以编程方式打开应用程序:
NSWorkspace.shared.launchApplication("Audio MIDI Setup")
Run Code Online (Sandbox Code Playgroud)
但是如何打开Bluetooth Configuration应用程序内的窗口呢?
我见过其他应用程序有一个菜单项可以直接打开此对话框。
coremidi ×10
midi ×7
objective-c ×6
ios ×5
core-audio ×3
audiounit ×2
macos ×2
swift ×2
audio-player ×1
bonjour ×1
c# ×1
c++ ×1
cocoa ×1
winforms ×1