• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • VC++5.0下MIDI、WAV及CD的播放

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    武漢石化設計院電算室 周紅漢 ---- 加入音樂是增強應用程序功能的所有方法中最簡單的一個。幾乎每個計算機 游戲 或多 媒體程序都以某種 MI DI或CD音樂為背景。音樂可以使用戶心情愉快;在合適的場合播 放恰當的音樂能夠使 程序員 和他的VC++程序煥發光彩。
    武漢石化設計院電算室 周紅漢

    ---- 加入音樂是增強應用程序功能的所有方法中最簡單的一個。幾乎每個計算機游戲或多 媒體程序都以某種MIDI或CD音樂為背景。音樂可以使用戶心情愉快;在合適的場合播 放恰當的音樂能夠使程序員和他的VC++程序煥發光彩。

    第一部分 MIDI的播放
    ---- 樂器數字化接口(MIDI)是由音樂界的一些大公司(包括生產電子音樂合成器的公司) 制訂的一項協議,后來被計算機產業所采用并成為多媒體音樂文件的標準格式。MIDI文件 一般較小,對硬件設備的要求高。

    ---- 一、 原理

    ---- 雖然MicroSoft支持MIDI文件,然而Visual C++或MFC并沒有創建任何組件來實現 這種支持,但是MicroSoft API提供了三種不同的方法來實現MIDI的播放:

    MCI(The Media Control Interface)。這是最基本的方法,本文將詳細討論這種方法。

    流緩沖器。這種格式允許應用程序為MIDI數據分配緩沖器。在需要精確控制MIDI播放的時候,流緩沖器將很有用處。

    低級MIDI設備。需要完全控制MIDI數據的應用程序可以使用這種方法。
    ---- MCI可以通過mciSendCommand()和mciSendString()來完成,本文僅使用mciSendCommand()函數。

    ---- 原型:DWORD mciSendCommand(UINT wDeviceID,UINT wMessage,DWORD dwParam1,DWORD dwParam2);

    參數:  wDeviceID:接受消息的設備ID
    wMessage:MCI命令消息
    dwParam1:命令的標志位
    dwParam2:所使用參數塊的指針

    ---- 返值:調用成功,返回零;否則,返回雙字中的低字存放有錯誤信息。

    二MIDI的播放控制
    ---- 1. 打開設備

    MCI_OPEN_PARMS OpenParms;
    OpenParms.lpstrDeviceType =
    (LPCSTR) MCI_DEVTYPE_SEQUENCER;//MIDI類型
    OpenParms.lpstrElementName = (LPCSTR) Filename;
    OpenParms.wDeviceID = 0;
    mciSendCommand (NULL, MCI_OPEN,
    MCI_WAIT | MCI_OPEN_TYPE |
    MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,
    (DWORD)(LPVOID) &OpenParms)

    ---- MCI設備ID指明打開了哪個設備,當發送了MCI_OPEN命令時,這個值在參數塊中返回——應被保存備用。

    ---- 2. 關閉設備

    mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);

    ---- 3. 播放

    MCI_PLAY_PARMS PlayParms;
    PlayParms.dwFrom = 0;
    // 指定從什么地方(時間)播放
    mciSendCommand (m_wDeviceID, MCI_PLAY,
    MCI_FROM, (DWORD)(LPVOID)
    &PlayParms));

    ---- 4. 暫停

    MCI_PLAY_PARMS PlayParms;
    mciSendCommand (m_wDeviceID, MCI_PAUSE, 0,
    (DWORD)(LPVOID) &PlayParms);

    ---- 5. 停止

    mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);

    ---- 6. 跳躍

    * 跳轉到任意地方
    MCI_SEEK_PARMS SeekParms;
    SeekParms.dwTo = (nMinute * 60 + nSecond) * 1000;
    //跳轉的目標時間,時間單位為毫秒
    mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_TO
    | MCI_WAIT,(DWORD)(LPVOID)
    &SeekParms);
    * 跳到文件頭
    mciSendCommand (m_wDeviceID, MCI_SEEK,
    MCI_SEEK_TO_START, NULL);
    * 跳到文件尾
    mciSendCommand (m_wDeviceID, MCI_SEEK,
    MCI_SEEK_TO_END, NULL);

    ---- 7. 查詢當前信息

    MCI_STATUS_PARMS StatusParms;
    StatusParms.dwItem = MCI_SEQ_STATUS_DIVTYPE;
    mciSendCommand (m_wDeviceID, MCI_STATUS,
    MCI_WAIT | MCI_STATUS_ITEM,
    (DWORD)(LPVOID) &StatusParms);
    返回信息存放于StatusParms.dwReturn中。
    MCI_STATUS標志
    MCI_STATUS_LENGTH  獲得文件長度
    MCI_STATUS_MODE  獲得文件播放的當前狀態
    MCI_STATUS_POSITION  獲得文件播放的當前位置
    MCI_STATUS_TIME_FORMAT  獲得當前的時間格式
    MCI_SEQ_STATUS_DIVTYPE  判斷文件是PPQN類型還是SMPTE類型
    MCI_SEQ_STATUS_TEMPO   獲得當前播放速度,PQRN類型,
    此值為節拍/分,SMPTE類型,此值為禎/秒

    ---- 8. 設置時間格式及播放速度

    MCI_SET_PARMS SetParms;
    SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
    //設置時間單位為毫秒
    mciSendCommand (m_wDeviceID,
    MCI_SET, MCI_SET_TIME_FORMAT,
    (DWORD)(LPVOID) &SetParms);
    MCI_SEQ_SET_TEMPO  設置播放速度,
    PQRN類型,此值為節拍/分,
    SMPTE類型,此值為禎/秒

    第二部分 WAV文件的播放
    ---- 一、原理

    ---- MicroSoft API提供了三種不同的方法來實現WAV的播放:

    PlaySound()函數。它可以通過單行編碼來播放Wave格式的聲音。此函數有兩個限制:必須將聲音數據完整地載入物理內存;數據格式必須被所配置的某一音頻驅動器支 持。根據經驗,PlaySound()適用于100K以下的文件。

    MCI(The Media Control Interface),與上一章播放MIDI文件相似,可以播放100K 以上的文件。

    低級Wave音頻設備。用這些設備可以運行完全控制Wave數據的應用文件。
    ---- 二、 WAV文件播放控制

    ---- 因為同樣使用MCI,與上一章相同,只列出不同的部分。

    ---- 1. 打開設備

    ---- 將MIDI的MCI_DEVTYPE_SEQUENCER 改為"waveaudio"

    ---- 2. 錄音

    MCI_RECORD_PARMS RecordParms;
    mciSendCommand (m_wDeviceID, MCI_RECORD,
    NULL, (DWORD)(LPVOID)
    &RecordParms);

    ---- 3. 保存錄音

    MCI_SAVE_PARMS SaveParms;
    SaveParms.lpfilename = (LPCSTR) Filename;
    mciSendCommand (m_wDeviceID, MCI_SAVE,
    MCI_SAVE_FILE | MCI_WAIT,
    (DWORD)(LPVOID) &SaveParms);

    第三部分 CD的播放
    ---- CD的獨特優勢在于,它由作曲家設計,并由音樂廠家生產。不同的計算機播放MIDI 文件時,聲音效果也不一樣,但是CD的聲音效果總是相同的。高品質的音頻對計算機用 戶產生的效果會使你感到吃驚。 我們依然采用MCI播放CD,大部分的播放控制與前兩部分相同,只列出不同的部分

    ---- 1. 開光驅門

    mciSendCommand (m_wDeviceID, MCI_SET,
    MCI_SET_DOOR_OPEN, NULL);

    ---- 2. 關光驅門

    mciSendCommand (m_wDeviceID, MCI_SET,
    MCI_SET_DOOR_CLOSED, NULL);

    ---- 3. 打開設備

    將MIDI的MCI_DEVTYPE_SEQUENCER 改為MCI_DEVTYPE_CD_AUDIO

    ---- 4. 播放

    ---- 指定播放起點必須經過MCI_MAKE_TMSF(Track,Minute,Second,Frame)轉化

    ---- 5. 查詢當前信息

    MCI_STATUS_CURRENT_TRACK   得到當前曲目
    MCI_STATUS_LENGTH  得到CD或指定曲目長度
    MCI_STATUS_MODE  得到驅動器的當前狀態
    MCI_STATUS_NUMBER_OF_TRACKS  得到CD曲目的數目
    MCI_STATUS_POSITION   得到當前格式下的位置
    MCI_STATUS_READY   檢查設備是否就緒
    MCI_STATUS_TIME_FORMAT  得到當前時間格式
    MCI_STATUS_MEDIA_PRESENT  檢查以確認CD是否在驅動器內
    MCI_CDA_STATUS_TYPE_TRACK 檢查已確認某曲目是否為音頻曲目

    ---- 注意:

    使用MCI_STATUS_LENGTH參數查詢CD 及曲目長度,返回值通過調用MCI_MSF_MINUTE(),MCI_MSF_SECOND()轉換為分、秒。

    MCI_STATUS_POSITION參數返回值調用MCI_TMSF_TRACK(), MCI_TMSF_MINUTE(), MCI_TMSF_SECOND(),MCI_TMSF_FRAME才能得到當前的位置的道、分、秒、幀。
    ---- 6. 跳躍

    ---- 跳轉的目標必須經過MCI_MAKE_TMSF(Track,Minute,Second,Frame)轉化最好將上述三種格式分開建類,或做成動態連接庫。在 Project-- >Setting-- >Link-- >Object/library modules中加入winmm.lib,源程序中包含。

    ---- MCI調用簡單,功能強大,可以滿足日常多媒體編程的基本需要。但是,MCI一次只能播放一個文件,使用DirectSound技術可以實現八個以上WAV文件的同時播放。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>