Giter Site home page Giter Site logo

xmidi-2.0's Introduction

#XMIDI ###简介

XMIDI是一款IOS上的MIDI文件播放引擎。 	
2.0版本与之前1.0相比最大的变化在于播放模式的变更,由原来的OpenAL改为了AudioUnit。
2.0版本支持多种乐器,可以自己定义和添加乐器。
本引擎使用OC编写,项目示例为Swift语言。
使用上有问题可以联系我。
邮件:[email protected]
QQ:56809958    
交流群:334533178

###更新履历 ####2015-07-09

1.更新2.1,增加播放控制方法。

    //Midi当前标准时间点(秒)(标准时间)
    @property (nonatomic) float timeStamp;
    //跳转到某个音符开始播放
    -(void)gotoNoteByTrackIndex:(int)trackIndex NodeIndex:(int)noteIndex;

####2015-05-22

1.初次版本发布。

###使用方法 ####1.初始化API

    //初始化。
    XMidiPlayer.xInit()

####2.资源释放API

    //资源释放。
    XMidiPlayer.xDispose()

####3.播放MIDI示例

    //读取文件
    var filePath = NSBundle.mainBundle().pathForResource("midiFileName", ofType: "mid")

    //根据URL播放MIDI
    var url = NSURL(fileURLWithPath: filePath!)
    var midiPlayer:XMidiPlayer = XMidiPlayer()
    midiPlayer.initMidi(url!)
    midiPlayer.play()

    //根据Data播放MIDI
    var data = NSFileManager.defaultManager().contentsAtPath(filePath!)
    var midiPlayer:XMidiPlayer = XMidiPlayer()
    midiPlayer.initMidiWithData(data)
    midiPlayer.play()

###4.XMidiPlayer播放控制API

    //Midi总播放时间(秒)(真实时间)
    @property (nonatomic,readonly) float totalTime;
    //Midi当前播放时间点(秒)(真实时间)
    @property (nonatomic) float time;
    //Midi当前标准时间点(秒)(标准时间)
    @property (nonatomic) float timeStamp;
    //当前播放进度 返回一个0~1的一个小数,代表进度百分比
    @property (nonatomic) float progress;

    //初始化MIDI URL
    -(void)initMidi:(NSURL*)midiUrl;
    //初始化MIDI Data
    -(void)initMidiWithData:(NSData*)data;
    //暂停
    -(void)pause;
    //播放、继续播放
    -(void)play;
    //重播
    -(void)replay;
    //关闭播放器
    -(void)closePlayer;
    //跳转到某个音符开始播放
    -(void)gotoNoteByTrackIndex:(int)trackIndex NodeIndex:(int)noteIndex;
    //Midi信息
    - (NSString *)midiDescription;

###5.XMidiPlayer委托事件

    //播放进度变化 progress是一个0~1的一个小数,代表进度百分比
    + (void)progressChanged:(double)progress;

###6.关于乐器字典

字典文件使用.aupreset文件,可以使用Apple的AU Lab生成。
可以在Xcode->Open Developer Tool->More Developer Tools中下载Audio Tools for Xcode。

乐器有两级分类,第一级17个大类,第二级128个子类。
每个大类有一种默认乐器,然后每个子类对应一种乐器。
其实还可以再细分,有兴趣的朋友可以看这里https://en.wikipedia.org/wiki/General_MIDI_Level_2

###7.默认乐器字典

我添加的不全,缺少的大家可以自己添加,可在XAudioPlayer.h文件中修改乐器字典。
第一级
InstrumentFirstType_Piano “Yamaha Grand Piano”
InstrumentFirstType_ChromaticPercussion “Celesta”
InstrumentFirstType_Organ ”Full Organ“
InstrumentFirstType_Guitar “Classical Acoustic Guitar”
InstrumentFirstType_Bass “Muted Electric Bass”
InstrumentFirstType_OrchestraSolo “String Ensemble”
InstrumentFirstType_OrchestraEnsemble “String Ensemble”
InstrumentFirstType_Brass “French Horns”
InstrumentFirstType_Reed ”Alto Sax“
InstrumentFirstType_Wind “Flutes”

第二级
InstrumentSecondType_OrchestralKit “Orchestral Kit”

xmidi-2.0's People

Contributors

lugia123 avatar

Stargazers

Sintone avatar  avatar Jun Li avatar kevin shen avatar OwenHuang avatar  avatar 果壳里的 avatar 屋檐上的猫 avatar Fyns avatar Norld avatar Leroyli avatar HowCouldYou avatar  avatar hengyangKing avatar mxl avatar  avatar Nick avatar Alessandro Aresta avatar zhengying avatar  avatar Tommy Jeff avatar  avatar  avatar John D. Pope avatar Stormer avatar

Watchers

Tommy Jeff avatar  avatar

xmidi-2.0's Issues

如何使用gotoNoteByTrackIndex跳转到某个小节的开始呢?

首先很感谢你提供的这个开源库!正需要这个。

现在我有个问题希望得到帮助。

一般情况下,跳转乐曲播放位置都是跳转小节,而不是某一个具体的音符位置(int值)。哦,当然,每小节的起始也是有一个索引数字的,但是我该如何得到它呢?

比如,我想通过方法来跳转到第二小节的起始处该如何实现?

我觉着扩展出一个计算小节并获取该小节起始位置索引数字的方法非常实用(比如,这样就可以很容易实现某个乐曲段落的循环播放)。

我的想法就是在解析MIDI文件内容的时候,累加每个音符的时值,当累加值==一小节应有的时值的时候,下一个index就是下一小节开始的位置。把这个位置添加到一个动态数组中。然后清空累加值,进行下一小节的计算,如此循环。最后,动态数组的长度+1就是该乐曲的小节总数,而且可以通过这个数组来获取乐曲每小节的起始位置了。

或者,你已经有了相应的实现方法,还请指点。

期待你的回复,谢谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.