download MKPatch.m
Language: ObjectiveC
Copyright: (c) 2001 tomandandy, Inc.
LOC: 55
Project Info
The MusicKit(musickit)
Server: SourceForge
Type: cvs
...sicKit\Frameworks\MusicKit\
   _ArielQP.h
   _DSPMK.h
   _error.h
   _midi.h
   _MKAppProxy.h
   _MKAppProxy.m
   _MKNameTable.h
   _MKNameTable.m
   _MKParameter.h
   _MTCHelper.h
   _MTCHelper.m
   _musickit.h
   _noteRecorder.h
   _OrchloopbeginUG.h
   _OrchloopbeginUG.m
   _ParName.h
   _ParName.m
   _scorefile.h
   _ScorefileVar.h
   _ScorefileVar.m
   _SharedSynthInfo.h
   _SharedSynthInfo.m
   _synthElementMethods.m
   _time.h
   ArielQP.h
   ArielQP.m
   classFuncs.h
   ConductorPrivate.h
   dsp_types.h
   DSPSerialPortDevice.h
   dspwrap.h
   EnvelopePrivate.h
   equalTempered.m
   errors.h
   fastFFT.c
   fastFFT.h
   GNUmakefile.postamble
   GNUmakefile.preamble.in
   InstrumentPrivate.h
   keynums.h
   libMusicKit.def
   Localized.strings
   make.sh
   Makefile.postamble
   Makefile.preamble
   midi_spec.h
   midifile.h
   midifile.m
   MidiPrivate.h
   midiTranslation.h
   MKConductor.h
   MKConductor.m
   MKConductorDelegate.h
   MKDeviceStatus.h
   MKEnvelope.h
   MKEnvelope.m
   MKFilePerformer.h
   MKFilePerformer.m
   MKFileWriter.h
   MKFileWriter.m
   MKInstrument.h
   MKInstrument.m
   MKMidi.h
   MKMidi.m
   MKMixerInstrument.h
   MKMixerInstrument.m
   MKMTCPerformer.h
   MKMTCPerformer.m
   MKNote.h
   MKNoteFilter.h
   MKNoteFilter.m
   MKNoteReceiver.h
   MKNoteReceiver.m
   MKNoteSender.h
   MKNoteSender.m
   MKOrchestra.h
   MKPart.m
   MKPartials.h
   MKPartials.m
   ...tialsWaveshapingTable.m
   MKPartPerformer.h
   MKPartPerformer.m
   MKPartRecorder.h
   MKPartRecorder.m
   MKPatch.h
   MKPatch.m
   MKPatchConnection.h
   MKPatchConnection.m
   MKPatchEntry.h
   MKPatchEntry.m
   MKPatchTemplate.h
   MKPatchTemplate.m
   MKPerformer.h
   MKPerformer.m
   MKPerformerDelegate.h
   MKPlugin.h
   MKSamplerInstrument.h
   MKSamplerInstrument.m
   MKSamples.h
   MKScore.h
   MKScore.m
   MKScorefileObject.h
   MKScorefilePerformer.h
   MKScorefilePerformer.m
   MKScorefileWriter.m
   MKScorePerformer.h
   MKScorePerformer.m
   MKScoreRecorder.h
   MKScoreRecorder.m
   MKSynthData.h
   MKSynthData.m
   MKSynthInstrument.h
   MKSynthPatch.h
   MKTimbre.h
   MKTimbre.m
   MKTuningSystem.h
   MKTuningSystem.m
   MKUnitGenerator.h
   MKUnitGenerator.m
   MKWaveTable.h
   MKWaveTable.m
   mtcMidi.m
   mtcMidiPrivate.m
   MusicKit-Info.plist
   MusicKit.h
   MusicKitConfig.h.in
   names.h
   noDVal.h
   noteDispatcherMethods.m
   NotePrivate.h
   noteRecorderCFuncs.m
   noteRecorderMethods.m
   orch.h
   OrchestraPrivate.h
   OrchloopbeginUG.h
   OrchloopbeginUG.m
   orchloopbeginUGInclude.m
   params.h
   parNames.m
   partialsDBInclude.m
   PartialsPrivate.h
   PartPerformerPrivate.h
   PartPrivate.h
   PartRecorderPrivate.h
   PatchTemplatePrivate.h
   PB.project
   PerformerPrivate.h
   pitches.h
   platform.make
   ...efilePerformerPrivate.h
   ScorePerformerPrivate.h
   ScorePrivate.h
   ScoreRecorderPrivate.h
   SynthDataPrivate.h
   synthElementCFuncs.m
   synthElementMethods.m
   SynthInstrumentPrivate.h
   SynthPatchList.h
   SynthPatchList.m
   SynthPatchPrivate.h
   timetagInclude.m
   timeunits.h
   tokenNames.m
   tokens.h
   trigonometry.c
   trigonometry.h
   TuningSystemPrivate.h
   UnitGeneratorPrivate.h
   win32-def.top
   writeBinary.m
   writeMidi.m
   writeScore.m

/*
  $Id: MKPatch.m,v 1.7 2005/05/30 03:30:52 leighsmith Exp $
  Defined In: The MusicKit

  Description:
    Each MKPatch 
    
  Original Author: Leigh M. Smith <leigh@tomandandy.com>

  Copyright (c) 2001 tomandandy, Inc.
  Permission is granted to use and modify this code for commercial and non-commercial
  purposes so long as the author attribution and this copyright message remains intact
  and accompanies all derived code.
*/
#import "MKPatch.h"

#define MK_SYNTHPATCH_DIR @"MusicKit/SynthPatches/"
#define MK_PATCH_EXTENSION @"bundle"

@implementation MKPatch

// TODO Nothing for now, eventually we could incorporate nib loading and display for each MKPatch.

@end

@implementation MKPatch(PatchLoad)

static NSString *findFilenameForClassname(NSString *className)
    /* Returns filename or nil if failure. Assumes name is non-NULL. */
{
    NSString *filename;
    NSString *ext;
    ext = [className pathExtension];
    if ([ext length])  {
        if (![ext isEqualToString: MK_PATCH_EXTENSION])
            filename = [className stringByAppendingPathExtension: MK_PATCH_EXTENSION];
        else
            filename = [NSString stringWithString: className];
    }
    else 
	filename = [NSString stringWithString: className];

    if (![filename isAbsolutePath]) {
        NSArray *libraryDirs = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSAllDomainsMask, YES);
        unsigned int i;
        
        for(i = 0; i < [libraryDirs count]; i++) {
            NSString *absolutePath = [[[libraryDirs objectAtIndex: i] 
                                        stringByAppendingPathComponent: MK_SYNTHPATCH_DIR]
                                        stringByAppendingPathComponent: filename];
            if ([[NSFileManager defaultManager] isReadableFileAtPath: absolutePath]) 
                return absolutePath;
        }
        return nil;
    }
    return [[NSFileManager defaultManager] isReadableFileAtPath: filename] ? filename : nil;
}

static Class getClassWithoutWarning(NSString *clname)
/* sb: checks all loaded classes to see if we have the named class. Surely NSClassFromString()
 * would do exactly the same thing? (I've tried it for a couple of examples in gdb, and appears
 * to have the desired behaviour)
 */
{
    return NSClassFromString(clname);
}

+ (Class) findPatchClass: (NSString *) className
    /* The user can load in arbitrary bundles. */
{
    NSString *filename;
    NSBundle *bundleToLoad;
    Class loadedClass;
    
    loadedClass = getClassWithoutWarning(className);
    if (loadedClass != nil)
	return loadedClass;
    filename = findFilenameForClassname(className);
    if (filename == nil) 
	return nil;
    bundleToLoad = [NSBundle bundleWithPath: filename];
    if ((loadedClass = [bundleToLoad classNamed: className]) != nil)
        return loadedClass;
    else
        return nil;
}

@end

About Koders | Resources | Downloads | Support | Black Duck | Submit Project | Terms of Service | DMCA | Privacy Policy | Site Map| Contact Us