当通过文件(.mid)加载MusicSequence时,我已成功将Sound Font(.sf2)加载到MusicSequence,如下所示:

        //the interesting code ...

        NSString *midiFilePath = [[NSBundle mainBundle]
                                   pathForResource:@"song"
                                   ofType:@"mid"];

        // Create a new URL which points to the MIDI file
        NSURL * midiFileURL = [NSURL fileURLWithPath:filePath];


        MusicSequenceFileLoad(s, (__bridge CFURLRef) midiFileURL, 0, 0);

        // Create a new music player
        MusicPlayer  p;
        // Initialise the music player
        NewMusicPlayer(&p);

        // ************* Set the endpoint of the sequence to be our virtual endpoint
        MusicSequenceSetMIDIEndpoint(s, virtualEndpoint);

        // Load the sound font from file
        NSURL *presetURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Full Grand Piano" ofType:@"sf2"]];

        // Initialise the sound font
        [self loadFromDLSOrSoundFont: (NSURL *)presetURL withPatch: (int)10];

        // Load the sequence into the music player
        MusicPlayerSetSequence(p, s);
        // Called to do some MusicPlayer setup. This just
        // reduces latency when MusicPlayerStart is called
        MusicPlayerPreroll(p);
        // Starts the music playing
        MusicPlayerStart(p);

        //code continues here ...


-(OSStatus) loadFromDLSOrSoundFont: (NSURL *)bankURL withPatch: (int)presetNumber {

    OSStatus result = noErr;

    // fill out a bank preset data structure
    AUSamplerBankPresetData bpdata;
    bpdata.bankURL  = (__bridge CFURLRef) bankURL;
    bpdata.bankMSB  = kAUSampler_DefaultMelodicBankMSB;
    bpdata.bankLSB  = kAUSampler_DefaultBankLSB;
    bpdata.presetID = (UInt8) presetNumber;

    // set the kAUSamplerProperty_LoadPresetFromBank property
    result = AudioUnitSetProperty(self.samplerUnit,
                          kAUSamplerProperty_LoadPresetFromBank,
                          kAudioUnitScope_Global,
                          0,
                          &bpdata,
                          sizeof(bpdata));

    // check for errors
    NSCAssert (result == noErr,
       @"Unable to set the preset property on the Sampler. Error code:%d '%.4s'",
       (int) result,
       (const char *)&result);

    return result;
    }


但是,如果我想将其应用于带有MIDINoteMessages的MusicTrack构建的MusicSequence:

//the interesting code here

MusicSequenceNewTrack(musicSequence, &musicTrack);

MusicSequenceGetIndTrack(musicSequence, 0, &(musicTrack));

MIDINoteMessage aMessage;
aMessage.channel = 1;

aMessage.duration = 0.3f;
aMessage.velocity = 200;

for(int i=0; i<numerator; ++i)
{
    if (i==0) {
        aMessage.note = 80;
    }else {
        aMessage.note = 60;
    }

    MusicTrackNewMIDINoteEvent(musicTrack, i, &aMessage);
}

MusicSequenceSetMIDIEndpoint(musicSequence, virtualEndpoint);

// Load the sound font from file
NSURL *presetURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Full Grand Piano" ofType:@"sf2"]];

// Initialise the sound font
[self loadFromDLSOrSoundFont: (NSURL *)presetURL withPatch: (int)10];

//code continues here


我收到(lldb)错误。任何想法如何解决这个问题?

最佳答案

这是我的github项目中与声音字体相关的代码。这会将声音字体加载到采样器单元中。如果您需要更多有关设置签名的信息,请参阅项目或阅读此post

func loadSF2Preset(preset:UInt8)  {

    // This is the MuseCore soundfont. Change it to the one you have.
    if let bankURL = NSBundle.mainBundle().URLForResource("GeneralUser GS MuseScore v1.442", withExtension: "sf2") {
        var instdata = AUSamplerInstrumentData(fileURL: Unmanaged.passUnretained(bankURL),
            instrumentType: UInt8(kInstrumentType_DLSPreset),
            bankMSB: UInt8(kAUSampler_DefaultMelodicBankMSB),
            bankLSB: UInt8(kAUSampler_DefaultBankLSB),
            presetID: preset)


        var status = AudioUnitSetProperty(
            self.samplerUnit,
            AudioUnitPropertyID(kAUSamplerProperty_LoadInstrument),
            AudioUnitScope(kAudioUnitScope_Global),
            0,
            &instdata,
            UInt32(sizeof(AUSamplerInstrumentData)))
        CheckError(status)
    }
}


您可以像这样将签名与MusicSequence关联

    MusicSequenceSetAUGraph(musicSequence, self.processingGraph)

关于ios - 使用MIDI Notes将Soundfont添加到音乐轨道吗? CoreMIDI iOS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30664468/

10-10 08:45