Java Sound API


Java Sound API是一組類和介面。它是一個低階API,用於影響和控制聲音媒體和MIDI(Musical Instrument Digital Interface,樂器數字介面)資料的輸入和輸出。它提供對通常需要的音效卡輸入和輸出功能的顯式控制,在一個促進可擴充套件性和靈活性的框架中。它包含兩個包:javax.sound.sampled和javax.sound.midi。

Java Sound API是為誰設計的?

Java Sound API滿足廣泛的應用程式開發人員的需求,因為聲音是一個至關重要的組成部分。可能的應用領域包括:

  • 通訊框架,包括電話和會議

  • 交付使用者生成內容的技術,例如媒體播放器和流媒體音樂

  • 互動式應用程式,例如遊戲和動態生成的網站

  • 內容編輯和製作

  • 實用程式、裝置和工具包。

其他介面如何與Java Sound API相關?

Java平臺使用Java Sound API提供最簡單的音訊功能。它靈活且為應用程式提供了對聲音操作的廣泛控制。例如,Java Sound API提供用於設定、訪問和修改系統資源的方法,包括音訊混音器、MIDI合成器、其他音訊或MIDI裝置、檔案讀取器和寫入器以及聲音格式轉換器。

雖然Java Sound API不包含高階聲音編輯器或圖形工具,但它確實提供了此類程式的構建塊。它強調低級別控制,這超出了終端使用者通常的預期。

其他Java平臺API提供了與聲音相關的元件。Java平臺的一個更高階的API是Java媒體框架(JMF),目前作為標準擴充套件提供。對於錄製和回放基於時間的素材,JMF定義了一個統一的體系結構、通訊協議和程式設計介面。JMF允許不同媒體型別(如音訊和影片)之間的同步。

它為基本的媒體播放器應用程式提供了更直接的解決方案。另一方面,對於主要關注聲音的程式(特別是如果它們需要更復雜的功能,例如精確控制延遲音訊播放或直接控制MIDI合成器),Java Sound API可能很有用。

Java 3D API、電話API和影片API是其他具有聲音相關功能的Java API。雖然不需要,但任何這些API的實現都可能在內部使用Java Sound API的實現。

Java Sound API中的包

Java Sound API同時支援數字音訊和MIDI資料。這兩個關鍵功能元素在不同的包中提供:

  • javax.sound.sampled - 指定用於捕獲、混合和播放數字音訊的介面。

  • javax.sound.midi - 指定用於MIDI合成、排序和事件傳輸的介面。

什麼是取樣音訊?

Java Sound API將數字音訊資料也稱為取樣音訊。它由javax.sound.sampled包處理。訊號以一系列樣本的形式捕獲。在音訊中,聲音波構成訊號。模數轉換器將麥克風產生的聲學訊號產生的模擬電訊號轉換為取樣數字形式。下圖顯示了聲音錄音的一小段。

此處提供的視覺表示告訴我們如何準確地在數字系統中捕獲聲音。具體來說,根據此圖表描述 - 時間沿X軸從左到右流動,Y軸 - 音訊級別對應於聲壓(振幅)。可見的紅色資料點表示離散樣本,產生捕獲模擬聲波測量的數字音訊訊號,以預定間隔定期減慢每個波峰或波谷,從而產生精確記錄的資料點,以便參考位於紅色線上方和下方的正值和負值進行分析,賦予收集的資料意義。水平中心線表示零振幅。取樣率決定時間的精度,量化或振幅的精度決定用於表示每個樣本的位數。作為比較,儲存在緊湊型CD上的音訊以每秒44,100個樣本的速度取樣,每個樣本表示16位。

這裡“取樣音訊”一詞使用得相當寬鬆。聲音波可以以模擬形式儲存,並以固定的間隔進行取樣。但是,Java Sound API將“取樣音訊”視為與“數字音訊”相同。

通常,計算機上的取樣音訊來自錄音,儘管聲音也可能是人工產生的(例如,模擬按鍵電話的聲音)。“取樣音訊”一詞描述的是資料型別,而不是資料來源。

音訊配置

Java Sound API旨在允許多種型別的音訊元件安裝在系統上並由API訪問;它並不預設特定的音訊硬體設定。Java Sound API支援標準功能,包括混合多個音訊流以及音效卡的輸入和輸出(例如,用於錄製和播放聲音檔案)。這是一個典型的音訊架構圖:

在此圖中,混合由程式提供,並透過具有多個輸入和輸出埠的裝置(例如音效卡)實現。資料可以從檔案中讀取,透過網路傳輸,由應用程式程式即時建立或由MIDI合成器合成併發送到混音器。

(稍後將介紹的javax.sound.midi包提供了用於合成器的Java語言介面)。從所有音訊輸入建立的單個流可以傳輸到輸出裝置進行渲染。

什麼是MIDI?

與取樣音訊(它是聲音的直接表示)不同,MIDI資料可以被視為製作聲音(特別是音樂聲音)的配方。與音訊資料不同,MIDI資料不直接描述聲音。相反,它談論的是影響合成器正在產生的聲音的事物。圖形使用者介面的鍵盤和滑鼠事件類似於MIDI資料。

在MIDI中,事件可以與鍵盤操作以及不同踏板、滑塊、開關和旋鈕上的鍵盤操作相比較。這些活動並不總是需要從物理樂器開始;它們可以在軟體中模擬並儲存為MIDI檔案。排序器是一個可以製作、修改和播放這些檔案的程式。排序器可以將其MIDI事件傳送到許多計算機音效卡中找到的MIDI可控音樂合成器電路。

此外,合成器可以在軟體中完全實現。合成器透過解釋接收到的MIDI訊號來生成音訊輸出。與語音相比,MIDI資料通常用於建立音樂聲音。也可以使用MIDI合成器產生不同的聲音效果。

MIDI配置

下圖顯示了基於Java Sound API的潛在MIDI配置的關鍵元素之間的功能連結。(與音訊一樣,Java Sound API允許安裝和連線各種MIDI軟體裝置。一種可能的情況是上面顯示的設定)。箭頭顯示資料在元件之間移動的方向。資訊可能採用常見的格式,如圖表右下角的鍵所示。

在此圖中,應用程式程式載入儲存在磁碟上的常用MIDI檔案(圖左側)中的樂譜,以準備音樂表演。典型MIDI檔案中的每個音軌都是一組帶時間標籤的MIDI事件。大多數事件類似於樂音(音調和節奏)。然後,軟體排序器讀取此MIDI檔案並“執行”它。排序器可以透過將MIDI資料傳送到另一個裝置(例如內部或外部合成器)來執行其音樂。合成器本身可以讀取包含模擬某些樂器聲音的說明的音庫檔案。如果沒有,合成器將使用當前載入到合成器中的任何樂器聲音來播放MIDI檔案中指定的音符。

使用Java Sound API的示例

這些都是Java Sound API解決的:

SEQUENCER >> SEQUENCE >> TRACK >> MIDI EVENTS

方法

  • 步驟1 - 獲取排序器,然後啟動它

// make a sequencer named play and open it 
Sequencer play = MIDISystem.getSequencer():
play.open();
  • 步驟2 - 建立一個新的序列

// make a new sequence
Sequence seq = new Sequence (Sequence.PPQ, 4);
  • 步驟3 - 在序列中獲取一個新的音軌

// creating a new track
Track t = seq.createTrack();
  • 步驟4 - 在音軌中放置MIDIEVENTS

// filing the track with MIDIEVENTS and
// giving the Sequence to the Sequencer

t.add(myMIDIEvent1); 
play.setSequence(seq);

// play it using start
play.start();

示例

// Java Program to Illustrate Java Sound API

import javax.sound.midi.*;
public class Example {

   public static void main (String [] args) {
      Example minimusic = new Example ();
      minimusic.play();
      System.out.print("Successfully compiled and executed");
   }

   // Method 2
   public void play() {
      try {
         Sequencer player = MidiSystem.getSequencer();
         play.open();

         Sequence seq = new Sequence(Sequence.PPQ, 4);
         Track track = seq.createTrack();
         ShortMessage a = new ShortMessage();
         a.setMessage(144, 1, 44, 100);

         MidiEvent noteOn = new MidiEvent(a, 1);
         track.add(noteOn);

         ShortMessage b = new ShortMessage();
         b.setMessage(128, 1, 44, 100);
         MidiEvent noteOff = new MidiEvent(b, 16);
         track.add(noteOff);

         play.setSequence(seq);

         play.start();
      }

      catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

輸出

Successfully compiled and executed

結論

Java Sound API是一個低階API。它用於影響和控制聲音媒體和MIDI資料的輸入和輸出。它提供對功能的顯式控制。該包滿足各種應用程式開發人員的需求。它包含兩個包,分別是javax.sound.sampled和javax.sounds.midi。

更新於:2023年8月1日

瀏覽量:632

開啟您的職業生涯

完成課程,獲得認證

開始學習
廣告
© . All rights reserved.