• Thứ Năm, 15/10/2009 05:16 (GMT+7)

    Lập trình xử lý âm thanh với Irrklang

    Engine Irrklang được phát triển bởi Ambiera có hai phiên hệ, một miễn phí cho người dùng với mục đích phi thương mại và một có phí đối với nhóm phát triển các sản phẩm thương mại. Vào thời điểm thực hiện bài viết này Ambiera đã cho ra phiên bản Irrklang 1.1.3c với nhiều tính năng mới và sửa nhiều lỗi trong các phiên bản trước.

    Đặc điểm

    Irrklang là engine âm thanh 2D và 3D hỗ trợ nhiều hệ điều hành khác nhau như Windows, Linux và MacOS. Được dùng nhiều trong các trò chơi và các ứng dụng xử lý âm thanh.

    Irrklang hỗ trợ các định dạng tệp tin âm thanh sau:

    - RIFF WAVE (*.wav)

    - OGG VORBIS (*.ogg)

    - MPEG-1 Audio Layer 3 (*.mp3)

    - AMIGA MODULES (*.mod)

    - IMPULSE TRACKER (*.it)

    - SCREAM TRACKER 3 (*.s3d)

    - FAST TRACKER 2 (*.xm)

    Bản thân engine ngoài việc hỗ trợ các thao tác thực thi tệp tin âm thanh còn dựng sẵn bên trong các hàm xử lý hiệu ứng âm thanh cao cấp như: Chorus, Compressor, Distorsion, Echo, Flanger Gargle, 3DL2Reverb, ParamEQ và WaveReverb...

    Bài viết này hướng dẫn lập trình với phân hệ miễn phí dùng cho Windows. Để lập trình xử lý âm thanh với engine Irrklang, trước hết bạn phải tải bộ thư viện Irrklang tại http://www.ambiera.com/irrklang.

    Sau khi giải nén chúng ta có bộ công cụ hỗ trợ lập trình âm thanh gồm các tệp tin thư viện liên kết động (*.dll), hướng dẫn sử dụng, các ví dụ cho Windows, và .NET.

    Khởi động Engine

    Sử dụng ngôn ngữ lập trình Visual C ++ 2005 Express. Khuôn mẫu cho một chương trình sử dụng engine Irrklang như sau:

    #include
    using namespace irrklang;
    #pragma comment(lib, "irrKlang.lib")
    int main(int argc, const char** argv)
    {
    ISoundEngine* engine = createIrrKlangDevice();

    if (!engine)
    {
    printf("Khong the khoi tao Engine \n");
    return 0; // Lỗi khởi tạo engine
    }
    //Nạp và thực thi file âm thanh thông qua hàm play2d()
    engine->play2D("nongnanhanoi.mp3", true);
    engine->drop(); // Gỡ bỏ Engine khỏi bộ nhớ
    return 0;
    }

    Diễn giải:

    1. #include - Nạp file header irrklang.h

    2. using namespace irrklang - Sử dụng không gian tên irrklang làm không gian tên mặc định

    3. pragma comment(lib, "irrKlang.lib") - Dẫn hướng biên dịch để trình biên dịch nạp thư viện irrklang.lib

    4. ISoundEngine* engine = createIrrKlangDevice(); - Khai báo một con trỏ thiết bị có kiểu ISoundEngine và khởi tạo Engine với các tham số mặc định.

    Có thể tách dòng lênh trên thành hai lệnh sau để mã chương trình rõ ràng và dễ đọc hơn:

    ISoundEngine* engine = 0;
    engine = createIrrKlangDevice();

    Đoạn lệnh sau kiểm tra việc nạp và khởi tạo Engine:

    if (!engine)
    {
    printf("Khong the khoi tao Engine \n");
    return 0; // Lỗi khởi tạo Engine
    }

    5. engine->play2D("nongnanhanoi.mp3", true); - Thực thi file âm thanh sử dụng play2d(), đây là hàm thông dụng để thực thi các tệp tin âm thanh khi sử dụng engine Irrklang, hàm này có các tham số như sau:

    - Tham số thứ nhất là đường dẫn và tên tệp tin âm thanh

    - Tham số thứ hai qui định việc lặp lại.

    6. engine->drop(); Khi kết thúc, gọi hàm drop() để gỡ bỏ engine ra khỏi bộ nhớ.

    Việc xử lý âm thanh đòi hỏi nhiều thao tác phức tạp, trong khuôn khổ bài báo hạn chế nên không thể liệt kê hết ở đây. Chỉ xin nêu một số chức năng mà engine Irrklang có hỗ trợ sẵn:

    - stopAllsound(): Dừng việc thực thi các Tệp tin âm thanh

    - setVolume(giatri): Đặt giá trị âm lượng

    - setMinDistance(giatri): Đặt khoảng cách đến nguồn âm

    - setPosition(vị trí): Đặt vị trí nguồn âm

    Irrklang còn hỗ trợ việc điều khiển các tình huống âm thanh:

    - isFinished(): Dùng để kiểm tra việc đã thực thi xong tệp tin âm thanh

    - isCurrentlyPlaying(): Kiểm tra tệp tin âm thanh đang được thực thi

    Khi viết các ứng dụng xử lý âm thanh, chúng ta thường muốn đưa vào các hiệu ứng cho âm thanh như: Chorus, Compressor, Distortion, Echo, Flanger Gargle, 3DL2Reverb, ParamEq và WavesReverb,... Irrklang xây dựng sẵn một số hàm chức năng để đáp ứng yêu cầu trên:

    - enableEchoSoundEffect(): Bật chế độ nhại (vọng) âm

    - enableChorusSoundEffect(): Bật chế độ hòa hợp âm

    - disableAllEffects(): Tắt hết các hiệu ứng

    Không thể bỏ qua một chức năng rất quan trọng đó là thực thi các giá trị âm thanh được nạp trực tiếp vào bộ nhớ, đây là tính năng cần thiết nhất đối với lập trình xử lý âm thanh, chúng ta có thể can thiệp đến từng giá trị của âm thanh và xử lý nó trước khi cho thực thi.

    - addSoundSourceFromMemory(): hàm dùng với quá trình xử lý âm thanh trong bộ nhớ
    startRecordingBufferedAudio():; Bắt đầu thu âm

    stopRecordingAudio(): Dừng thu âm

    addSoundSourceFromRecordedAudio(): Nạp âm thanh đã thu vào con trỏ nguồn âm để thực thi

    Chú ý: Nếu trong quá trình thực hiện bạn thấy chương trình không thực thi được một tệp tin *.mp3 thì có thể khắc phục bằng cách copy tệp tin plugin ikpMp3.dll đi kèm theo với bộ công cụ vào cùng thư mục chứa tệp tin chương trình của bạn.

    Ths. Phạm Quang Vinh
    Email: qvpham1979@yahoo.co.uk

    ID: A0909_132