如何使用iPhone 播放 MIDI 文件方法
创始人
2024-08-03 02:40:13
0

iPhone 播放 midi 文件方法是本文要介绍的内容,吸纳来看内容。iPhone 默认不带播放MIDI的框架,所以播放MIDI还得寻求第3方的库帮忙。这里使用的库就是大名鼎鼎的 FMOD ,许多火爆游戏使用的都是这个库。开发者可以免费下载使用。

首先下载安装 FMOD API FOR IPHONE:http://www.fmod.org/index.php/release/version/fmodapi42607iphone- installer.dmg。

安装后可以在目录中看到不少示范代码,可惜没有MIDI

自己写一个:)感谢强大的api,写起来异常轻松。

新建一个基于view项目

修改项目属性,添加 Other Linker Flags 为 -lfmodexL_$PLATFORM_NAME

添加 Header Search Paths :/Developer/FMOD Programmers API iPhone/api/inc (默认是这个位置,修改成自己FMOD安装的目录)

添加 Library Search Paths :/Developer/FMOD Programmers API iPhone/api/lib (同上)

把 appDelegate 修改成 .mm 的后缀

MIDI 播放需要一个 DLS 文件, 在osx 下没找到,这里使用了xp 自带的 gm.dls 文件(3M 有点大~),拷贝到项目中。

修改ViewController 代码如下 ,随便在xib文件中链接两个按钮action上即可

运行(真机有效)

主要代码

  1.   //  
  2.   // PlayMidiDemoViewController.m  
  3.   // PlayMidiDemo  
  4.   //  
  5.   // Created by xhan on 9/9/09.  
  6.   // Copyright In-Blue 2009. All rights reserved.  
  7.   //  
  8.   #import "PlayMidiDemoViewController.h"  
  9.   @implementation PlayMidiDemoViewController  
  10.   @synthesize status;  
  11.   @synthesize time;  
  12.   void ERRCHECK(FMOD_RESULT result)  
  13.   {  
  14.   if (result != FMOD_OK)  
  15.   {  
  16.   fprintf(stderr, "FMOD error! (%d) %s ", result, FMOD_ErrorString(result));  
  17.   exit(-1);  
  18.   }  
  19.   }  
  20.   - (void)viewDidLoad {  
  21.   [super viewDidLoad];  
  22.   system = NULL;  
  23.   sound1 = NULL;  
  24.   sound2 = NULL;  
  25.   channel = NULL;  
  26.   }  
  27.   - (void)didReceiveMemoryWarning {  
  28.   // Releases the view if it doesn't have a superview.  
  29.     
  30.   [super didReceiveMemoryWarning];  
  31.   // Release any cached data, images, etc that aren't in use.  
  32.   }  
  33.   - (void)viewDidUnload {  
  34.   // Release any retained subviews of the main view.  
  35.   // e.g. self.myOutlet = nil;  
  36.   }  
  37.   - (void)dealloc {  
  38.   [status release], status = nil;  
  39.   [time release], time = nil;  
  40.   [super dealloc];  
  41.   }  
  42.   - (void)viewWillAppear:(BOOL)animated  
  43.   {  
  44.   FMOD_RESULT result = FMOD_OK;  
  45.   char buffer[200] = {0};  
  46.   unsigned int version = 0;  
  47.   /*  
  48.   Create a System object and initialize  
  49.   */  
  50.   result = FMOD::System_Create(&system);  
  51.   ERRCHECK(result);  
  52.   result = system->getVersion(&version);  
  53.   ERRCHECK(result);  
  54.   if (version < FMOD_VERSION)  
  55.   {  
  56.   fprintf(stderr, "You are using an old version of FMOD %08x. This program requires %08x ", version, FMOD_VERSION);  
  57.   exit(-1);  
  58.   }  
  59.   result = system->init(32, FMOD_INIT_NORMAL | FMOD_INIT_ENABLE_PROFILE, NULL);  
  60.   ERRCHECK(result);  
  61.   // set up DLS file  
  62.   FMOD_CREATESOUNDEXINFO soundExInfo;  
  63.   memset(&soundExInfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));  
  64.   soundExInfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);  
  65.   char dlsName[200] = {0};  
  66.   [[NSString stringWithFormat:@"%@/gm.dls", [[NSBundle mainBundle] resourcePath]] 
  67. getCString:dlsName maxLength:200 encoding:NSASCIIStringEncoding];  
  68.   soundExInfo.dlsname = dlsName;  
  69.   // midi one  
  70.   [[NSString stringWithFormat:@"%@/Bass_sample.mid", [[NSBundle mainBundle] resourcePath]] 
  71. getCString:buffer maxLength:200 encoding:NSASCIIStringEncoding];  
  72.   result = system->createSound(buffer, FMOD_SOFTWARE | FMOD_CREATESTREAM, &soundExInfo, &sound1);  
  73.   // ERRCHECK(result);  
  74.     
  75.   result = sound1->setMode(FMOD_LOOP_OFF);  
  76.   // ERRCHECK(result);  
  77.   // midi two  
  78.   [[NSString stringWithFormat:@"%@/Drum_sample.mid", [[NSBundle mainBundle] resourcePath]]
  79.  getCString:buffer maxLength:200 encoding:NSASCIIStringEncoding];  
  80.   result = system->createSound(buffer, FMOD_SOFTWARE | FMOD_CREATESTREAM, &soundExInfo, &sound2);  
  81.   result = sound2->setMode(FMOD_LOOP_OFF);  
  82.   // timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(timerUpdate:) userInfo:nil repeats:YES];  
  83.   }  
  84.   - (IBAction)playSound1:(id)sender  
  85.   {  
  86.   FMOD_RESULT result = FMOD_OK;  
  87.   result = system->playSound(FMOD_CHANNEL_FREE, sound1, false, &channel);  
  88.   ERRCHECK(result);  
  89.   }  
  90.   - (IBAction)playSound2:(id)sender  
  91.   {  
  92.   FMOD_RESULT result = FMOD_OK;  
  93.   result = system->playSound(FMOD_CHANNEL_FREE, sound2, false, &channel);  
  94.   ERRCHECK(result);  
  95.   }  
  96.   - (void)timerUpdate:(NSTimer *)timer  
  97.   {  
  98.   }  
  99.   @end 

 

小结:关于如何使用iPhone 播放 MIDI 文件方法介绍完了,希望本文读你有所帮助!

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...