JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 程式分享區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 取得電子樂器(電鋼琴)的按鍵訊號
bluewingsky





發文: 409
積分: 0
於 2015-06-09 14:09 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最近因為在學鋼琴,需要加強看五線譜的能力,
但是大部份的視譜練習軟體都是用虛擬鍵盤,
電腦的就是要用滑鼠點,手機的就是用觸控點。

所以想說自己寫一個可以直接用電鋼琴的琴鍵來彈的視譜軟體,
就是螢幕上會跑五線譜的音符,然後用電鋼琴來彈奏。

但無奈這方面可以找的資料太少,
大部份有關midi 的資料都在講播放音效,
或是怎麼寫可以發聲的虛擬樂器。

直接看API又看不是很懂它在講什麼,
好不容易才從某日文範例中找到相關的資料,
搭配了看不是很懂的API說明之後,
終於整理出了我想要的功能。

要不是找到了那個日文範例,我還真寫不出來,
雖然看不懂日文,但好在程式碼是共通語言XD

以下是我針對我需要的功能所寫的範本,
因為我目前只需要取得是哪一個琴鍵被按下的訊息,
所以以下有些其他功能就沒有仔細去研究它。
有需要的人可以看看。

日後等我寫完會再把完整版放上來(雖然需要的人應該會很少...成人學鋼琴的真少...)
我預計是先寫個電腦版的試作,功能都ok之後會再移植到Android上,
不過我不是天天都有時間寫,所以可能會很久。

對這方面有更深研究的前輩也麻煩指教一下,
是不是有相關的網站資料或是書藉有在講這方面的東西。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import javax.sound.midi.*;
 
public class test {
 
    public void play(){
        try {
            MidiDevice.Info md[]=MidiSystem.getMidiDeviceInfo();//取得電腦上的MidiDevice資訊
 
            /*將欲取得的設備取出
            *
            *有out與in兩種,要從外接設備接收琴鍵訊號要取得MidiInDevice
            */
            MidiDevice dev_in=MidiSystem.getMidiDevice(md[1]);
 
            //將設備打開
            if(!dev_in.isOpen()){
                dev_in.open();
                System.out.println("dev_in is open.");
            }
 
            //取得Transmitter,然後設定自定義的Receiver介面
            //琴鍵彈奏的訊號會呼叫send方法,由MidiMessage接收
            dev_in.getTransmitter().setReceiver(
                new Receiver(){
                    public void close(){};
 
                    public void send(MidiMessage message, long timeStamp){
                        if (message instanceof ShortMessage) {
 
                            ShortMessage sm = ((ShortMessage)message);
 
                            if(sm.getCommand()==ShortMessage.NOTE_ON) {//按下琴鍵
                                //Data1=音符,Data2=力度 ,timeStamp似乎是音符的時間記錄,長度如何計算的未知
                                System.out.println("On: "+sm.getData1()+" : "+sm.getData2()+" : "+timeStamp);
 
                            }else if(sm.getCommand()==ShortMessage.NOTE_OFF){//放開琴鍵
                                //Data1=音符,Data2=未知
                                System.out.println("Off: "+sm.getData1()+" : "+sm.getData2());
                           }
                        }
                    }
                }
            );
 
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}


bluewingsky edited on 2015-06-10 04:50
reply to postreply to post
作者 Re:取得電子樂器(電鋼琴)的按鍵訊號 [Re:bluewingsky]
roytsang





發文: 618
積分: 1
於 2015-09-23 01:34 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
希望對你有用啦:
https://docs.oracle.com/javase/tutorial/sound/overview-MIDI.html


reply to postreply to post
» JWorld@TW »  Java 程式分享區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8