日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android midi 编辑6,Android6.0MIDI设备相关应用程序开发

發布時間:2024/3/24 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android midi 编辑6,Android6.0MIDI设备相关应用程序开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近開發了一款基于Android6.0系統的鋼琴學習系統,本文將主要介紹MIDI協議的常識、Android MIDI 相關API的使用,以及MIDI應用程序開發需要借鑒的開源項目,最后分析本項目的架構。

本文的主要結構如下圖所示:

本文項目架構

1.MIDI概述

1.1樂器數字接口

(Musical Instrument Digital Interface,簡稱MIDI)是一個工業標準的電子通信協議.為電子樂器等演奏設備(如合成器)定義各種音符或彈奏碼,容許電子樂器、電腦、手機或其它的舞臺演出配備彼此連接,調整和同步,得以即時交換演奏數據。MIDI不發送聲音,只發送像是音調和音樂強度的數據,音量,顫音和相位[1]等參數的控制信號,還有設置節奏的時鐘信號。在不同的電腦上,輸出的聲音也因音源器不同而有差異。

1.2 MIDI的優點

1.共通語言及語法:

鍵盤樂器,電子鼓,電腦,編曲機及其他為MIDI設計出來的特殊功能電子樂器之間可以輕易的相互鏈接

2.簡化的鏈接:

減少了音樂設備之間導線、信號線鏈接的復雜性(如音量控制)

3.更少的演出者:

1980年代初期,音樂演出者可以僅靠一至兩人進行現場演出,同時操作數臺MIDI設備,制造出像交響樂團般的演出效果

4.更低的獲取門檻:

用戶可以以更少的花費創作、編輯、制作高質量的數字音樂。專業的音樂家可以在家里自己錄音,宅錄,不用花錢租錄音室,也不用請一堆樂手來幫忙錄音。同時更讓沒音樂基礎的愛好者可以利用MIDI音樂軟件高度擴充性進行高質量錄音

5.方便可攜的電子音樂器材:

大量減少了樂手巡回演出時所需攜帶的樂器、器材與線材的數量,在搬運、裝載、架設器材也簡易了許多,卻仍可以制造出相當的音色與效果.

1.3 MIDI的運作過程

當MIDI播放器演奏了一個音符的時候,它隨之將音符轉換成MIDI信息。一個典型的由鍵盤獲取的音符的MIDI信息的過程包括:

1.用戶以特定速率(又譯,力度-velocity)演奏中央C音符。

2.用戶改變按壓鍵盤按鍵的力度-這個技術稱為鍵后觸感(aftertouch)。

3.用戶釋放并停止演奏中央C音符。

2.Android Midi相關API

2.1用到的主要類在android.media.midi中,除此之外還要用到音頻播放相關的API:AudioTrack,AudioRecord等相關API.

2.2接口 MidiManager.OnDeviceOpenedListener

/**? ? * Listener class used for receiving the results of {@link #openDevice} and? ? * {@link #openBluetoothDevice}? ? */? ? public interface OnDeviceOpenedListener {? ? ? ? /**? ? ? ? * Called to respond to a {@link #openDevice} request? ? ? ? *? ? ? ? * @param device a {@link MidiDevice} for opened device, or null if opening failed? ? ? ? */? ? ? ? abstract public void onDeviceOpened(MidiDevice device);? ? } 在調用Midimanger.openDevice(MidiDeviceInfo, MidiManager.OnDeviceOpenedListener, Handler)方法時需要傳入這樣一個接口,再回調函數里能夠得到打開的設備MidiDevice

2.3相關類

2.3.1 MidiDevice該類屬于Midi設備,該類的創建比較特殊,需要通過 openDevice(MidiDeviceInfo, MidiManager.OnDeviceOpenedListener, Handler)進行創建,在MidiManager.OnDeviceOpenedListener的回調中會得到該類1 MidiDeviceInfo getInfo ()2 MidiInputPort openInputPort (int portNumber)3 MidiOutputPort openOutputPort (int portNumber)這三個方法相對比較容易理解,主要用來得到設備的信息,通過端口號來打開一個輸入端口和輸出端口4 MidiDevice.MidiConnection connectPorts (MidiInputPort inputPort,? ? ? ? ? ? ? ? int outputPortNumber)這個方法相對比較特殊,主要用來將兩個設備連接起來,第一個參數為需要連接的設備的輸入端口,第二個參數為輸出設備的輸出端口號

2.3.2 MidiDevice.MidiConnection兩個設備連接在一起的connection當需要斷開連接時需要關閉對應的connection ,釋放流和相應的系統資源,防止內存泄漏等

2.3.3 MidiDeviceInfoMidiDeviceInfo 包含了設備的所有物理信息的詳細描述,而真正在不通設備之間建立連接的是MidiDevice.MidiDeviceInfo包含豐富的物理信息:PROPERTY_BLUETOOTH_DEVICEPROPERTY_MANUFACTURERPROPERTY_NAMEPROPERTY_PRODUCTPROPERTY_SERIAL_NUMBERPROPERTY_USB_DEVICEPROPERTY_VERSIONTYPE_BLUETOOTHTYPE_USBTYPE_VIRTUAL可以通過下面的方法傳入不同的常量來獲得對應的信息info.getProperties()? ? ? ? ? ? ? ? ? ? .getString(MidiDeviceInfo.PROPERTY_MANUFACTURER);int getId ():返回設備的id號int getInputPortCount ():得到設備的輸入端口的個數int getOutputPortCount ()得到設備輸出端口的個數PortInfo[] getPorts ():返回設備的端口? ,返回的變量是一個數組,可能包含設備的輸入端口和輸出端口,PortInfo是MidiDeviceInfo的內部類,包含端口的信息,輸入輸出類型等Bundle getProperties ():返回一個bundle對象,可以用其或得設備的物理信息int getType ():得到設備的類型boolean isPrivate ():判斷設備是否屬于私有設備

2.3.4 MidiDeviceInfo.PortInfoString getName ()int getPortNumber ()int getType ()幾個方法很容易理解分別返回端口的名字 端口號 以及輸入輸出類型

2.3.5 MidiDeviceServiceMidiDeviceService? 繼承于Service ,用于創建一個虛擬的Midi設備一般情況下,我們通過繼承這個類去構建一個虛擬的Midi設備,繼承這個類必須重寫兩個方法,分別用來接收其他Midi設備發出的信息,或者向其他設備發送信息? MidiReceiver[] onGetInputPortReceivers (),向service設備提供MidiReceiver 去接收信息? MidiReceiver[] getOutputPortReceivers () ,用來提供發送信息的MidiReceiver并且繼承這個類必須在Manifest文件中進行注冊我們可以定義該虛擬設備的制造商,產品? 以及輸入輸出類型等信息MidiDeviceInfo getDeviceInfo ()得到該設備的信息void onDeviceStatusChanged (MidiDeviceStatus status)在設備的狀態被改變時進行回調

2.3.6 MidiDeviceStatus1.MidiDeviceInfo getDeviceInfo ()能夠通過狀態改變的回調,得到設備的信息2.int getOutputPortOpenCount (int portNumber)假如該設備是一個輸出設備,能夠得到所有與該輸出設備某端口(portNumbe)連接的設備的數量,一個輸出設備能夠同時被多個設備連接。3.boolean isInputPortOpen (int portNumber)假如該設備是一個輸入設備,能夠得到該輸入設備的某個端口是否打開,一個輸入設備,只能被一個設備連接

2.3.7 MidiInputPort

2.3.8 MidiManagerMidiManger 是MIDI設備的管理者 ,類似于PackgerManger MediaManger 等系統某一類的管理者,其得到的方式與其他Manger的得到方式類似:MidiManager manager = (MidiManager) getSystemService(Context.MIDI_SERVICE);幾個常用的公用方法:1 MidiDeviceInfo[] getDevices ()? 該方法能夠返回 系統所連結的所有MIDI設備,系統能夠識別多個不同的MIDI設備,甚至包括輸入輸出設備,并將這些設備的相關信息以數組的形式返回2 void openBluetoothDevice (BluetoothDevice bluetoothDevice,? ? ? ? ? ? ? ? MidiManager.OnDeviceOpenedListener listener,? ? ? ? ? ? ? ? Handler handler)? 該方法表明系統可以連接通過藍牙連接MIDI設備,假設該Midi設備支持藍牙,因開發過程中沒有此設備,沒有做過測試,但藍牙Midi設備的可擴展性、便攜性無疑更強3 void openDevice (MidiDeviceInfo deviceInfo,? ? ? ? ? ? ? ? MidiManager.OnDeviceOpenedListener listener,? ? ? ? ? ? ? ? Handler handler) 該方法用來打開一個設備,需要傳入被打開設備的信息 打開設備的回調接口 以及Handler4 void registerDeviceCallback (MidiManager.DeviceCallback callback,? ? ? ? ? ? ? ? Handler handler) 注冊一個回調接口,用來檢測設備的插入與連接,當設備被連接時,如果該設備有打開的端口, onDeviceStatusChanged(MidiDeviceStatus)方法會立刻被調用.5 void unregisterDeviceCallback (MidiManager.DeviceCallback callback) 注銷回調接口

2.3.9 MidiManager.DeviceCallback當設備被連接時的回調:void onDeviceAdded (MidiDeviceInfo device)void onDeviceRemoved (MidiDeviceInfo device)void onDeviceStatusChanged (MidiDeviceStatus status)? 分別對應設備插入 移除 狀態改變的 notifaction 通知

2.3.10 MidiOutputPort

2.3.11 MidiReceiverMidiReceiver 用來接收來自Midi設備的信息或者向Midi設備發送信息1.int getMaxMessageSize () 返回MidiReceiver可以接受的信息的最大容量2 void onSend (byte[] msg,? ? ? ? ? ? ? ? int offset,? ? ? ? ? ? ? ? int count,? ? ? ? ? ? ? ? long timestamp)當信息被傳遞的時候被調用3 void send (byte[] msg,? ? ? ? ? ? ? ? int offset,? ? ? ? ? ? ? ? int count)用來發送信息(不包含發送時間)4 void send (byte[] msg,? ? ? ? ? ? ? ? int offset,? ? ? ? ? ? ? ? int count,? ? ? ? ? ? ? ? long timestamp)用來發送信息(包含時間戳)

2.3.12MidiSenderMidiSender 用來綁定Midi設備的MidiReceiver1 void connect (MidiReceiver receiver)用來連接某個MidiReceiver

2.2.4相關開源項目

https://github.com/googlesamples/android-MidiScope.git(只發送信息,不發聲音)https://github.com/googlesamples/android-MidiSynth.git(能夠檢測設備,連接設備并發聲)

3.項目架構項目架構及詳細分析見項目源碼

https://github.com/duanjiefei/MidiPaino.git

總結

以上是生活随笔為你收集整理的android midi 编辑6,Android6.0MIDI设备相关应用程序开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日色网站| 欧美20p| 国产一级二级三级在线观看 | 国产盗摄一区二区三区在线 | 18我禁在线观看 | 五月天丁香网 | 色一情| 欧美人与zoxxxx另类 | 韩日av片 | 日韩精品一区二区三区国语自制 | 日本精品人妻无码免费大全 | 奇米影视第四色首页 | 欧美日韩国产综合在线 | 日日摸日日添日日碰9学生露脸 | 嫩草一二三 | 日韩第八页 | 成人精品久久久午夜福利 | 91丝袜一区在线观看 | 亚洲国产精品久久久 | 性视频一区 | 国产鲁鲁视频在线观看免费 | 午夜精品久久久久久久99 | av资源导航 | 久久午夜精品 | 日韩综合一区二区 | 91入囗| 国产激情亚洲 | 小日子的在线观看免费第8集 | 国产我不卡 | 在线中出 | 国产免费一区二区视频 | 精品久久久久久久久久久aⅴ | 天天操 夜夜操 | 国产999在线 | 靠逼视频网站 | 一级黄色片看看 | 欧美日韩一区二区三区69堂 | 大屁股一区二区三区 | 免费一级片 | 浴室里强摁做开腿呻吟男男 | 女教师高潮黄又色视频 | 亚洲欧美另类视频 | 人妻换人妻仑乱 | 伊人网中文字幕 | 人人爽人人射 | 久久久久久网址 | 欧美男同又粗又长又大 | 国产麻豆一精品一av一免费 | 日韩精品在线不卡 | 日本艳妇 | 国产在线观看免费 | 毛片在线免费 | 精品国产大片大片大片 | 久久精品国产免费看久久精品 | 欧美日韩一区二区电影 | 夜夜草天天干 | www.成人av.com | 三级视频在线观看 | 狠狠干夜夜 | www.com色| 日本网站免费观看 | 久久天天躁狠狠躁夜夜躁 | 国产视频精品一区二区三区 | 人妻射精一区二区 | 国产综合欧美 | 欧美日韩亚洲不卡 | 精品少妇白浆小泬60P | 国产精品视频无码 | jizz在线观看视频 | 国产精品乱码久久久久久 | 国产激情无码一区二区 | 女人十八岁毛片 | 极品少妇一区二区三区 | av导航网 | 久久va | 波多野结衣福利 | 青青视频免费在线观看 | 午夜老司机福利 | 九色一区| 日本黄色免费看 | 亚洲欧美福利 | 中文字幕免费高清网站 | 尤物网站在线 | 国产污污在线观看 | 波多野结衣欧美 | 亚洲人成777 | 日韩中文字幕观看 | 久久精品国产精品 | 国产h视频在线 | 草草福利影院 | 国产美女在线看 | 国产卡一卡二卡三 | 日本在线观看一区 | 国产精品色婷婷99久久精品 | 91淫黄大片| 一级艳片新婚之夜 | 久久久欧美精品sm网站 | 亚洲精品1区 | 美女毛片在线观看 |