Чиптюны в Delphi (Chiptunes in Delphi)

  1. Итак, мы продолжаем цикл статей по всяким хитростям и фишкам в программах на делфи.
    На этот раз мы прикрутим к своей программе Чиптюн. Вы спросите: что такое чиптюн?
    Чиптюн - это такая музыка, которая звучит в кейгенах, патчерах и т.д. Но мы не будем сейчас заниматься кейгенописанием. Цель данного урока - прикрутить в нашу программу трекерную музычку.

    Нам понадобится:

    Для начала, создадим новый проект, и сохраним его.
    Теперь открываем Resource Builder. Слева видим раздел RCData. Жмем правой кнопкой на этом разделе, и жмем Добавить...
    Добавляем файл нашей музычки (возможные расширения файлов: XM, IT, S3M, MOD, MTM, UMX). Ресурс назовем CHIP.
    Ресурсы выбрали, теперь их нужно сохранить в res-файл. Жмем Сервис->Компилировать. Выбираем тип файла Resource Files (*.res) и сохраняем его в папку с проектом под именем bassres.res. Ресурс готов. Привязывать его к программе нужно следующим образом:
    После строчки:
    Код:
    {$R *.dfm}
    дописать эту строку:
    Код:
    {$R bassres.res}
    Теперь вернемся к нашему проекту.
    Весь рецепт подключения этой библиотеки воспроизведения я высмотрел у Inno Setup скриптов.=) Объявим глобальные константы:
    Код:
    const
      BASS_MUSIC_RAMP               = 1;      [COLOR="Lime"]// (только для Fast Tracker .xm)[/COLOR]
      BASS_MUSIC_RAMPS             = 2;      [COLOR="Lime"]// (только для Fast Tracker .xm)[/COLOR]
      BASS_MUSIC_LOOP                = 4;      [COLOR="Lime"]// повторение[/COLOR]
      BASS_MUSIC_FT2MOD           = 16;     [COLOR="Lime"]// играть .MOD как FastTracker 2[/COLOR]
      BASS_MUSIC_PT1MOD           = 32;     [COLOR="Lime"]// играть .MOD как ProTracker 1[/COLOR]
      BASS_MUSIC_SURROUND     = 512;    [COLOR="Lime"]// звучание surround[/COLOR]
      BASS_MUSIC_SURROUND2   = 1024;   [COLOR="Lime"]// звучание surround (режим 2)[/COLOR]
    Они нужны BASSMODу. И не спрашивайте меня - зачем они нужны! Я не знаю))

    Теперь добавим возможность экспортировать процедуры воспроизведения из DLL-файла. Файл этой библиотеки будет распространяться рядом с нашей программой. Объявляются они после раздела глобальных переменных (это перед разделом implementation):
    Код:
    function BASSMOD_Init(device: Integer; freq, flags: DWORD): Boolean;stdcall;
    external 'BASSMOD.dll';
    
    function BASSMOD_MusicStop(): Boolean; stdcall;
    external 'BASSMOD.dll';
    
    function BASSMOD_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): Boolean;
    stdcall;external 'BASSMOD.dll';
    
    function BASSMOD_MusicPlay(): Boolean;
    stdcall;external 'BASSMOD.dll';
    
    procedure BASSMOD_Free();
    stdcall;external 'BASSMOD.dll';
    Напишем процедуру извлечения из ресурсов чиптюн-файла:
    Код:
    function ExtractRes(const ResName, ResOut: string);
    var
      rt: TResourceStream;
    begin
    rt:= TResourceStream.Create(hInstance, ResName, RT_RCDATA);
    rt.SaveToFile(ResOut);
    rt.free;
    end;
    Давайте сделаем так, чтобы музычка грузилась при запуске программы. Для этого на вкладке Events у главной формы выбираем OnCreate и жмем двойным щелчком по пустому полю чуть правее. Появится редактор кода.
    Извлечем чиптюн в папку с программой:
    Код:
    ExtractRes('CHIP', ExtractFileDir(ParamStr(0))+'\temp.mod'); [COLOR="Lime"]//temp.mod - имя чиптюна[/COLOR]
    Теперь таким вот коротеньким кодом заставим воспроизводиться музычку:
    Код:
     if not BASSMOD_Init(-1,44100,0) then
        BASSMOD_Free;
     if BASSMOD_MusicLoad(FALSE, PChar('temp.mod'), 0, 0, 4 or 512 or 32 or 1) then
        BASSMOD_MusicPlay;
    ОК!=) Проверьте, музыка будет воспроизводиться) Но это еще не все! Добавим удаление файлов при закрытии программы, и остановку музыки. Делать это будем на OnDestroy:
    Код:
    BASSMOD_MusicStop;
    BASSMOD_Free();
    DeleteFile(ExtractFileDir(ParamStr(0))+'\temp.mod');
    Все на этом!

    Файлы проекта:


    Скомпилированный exe-файл:


    P.S. Хороший чиптюн способен украсить вашу программу, и привлечь пользователя, даже если она имеет ужасный дизайн)

    Автор статьи: Dr. MefistO
     
    3 пользователям это понравилось.
  2. Советую обратить внимание на такой комплект юнитов, как uFMOD. http://ufmod.sourceforge.net/

    Не требуется таскать за собой DLL. Совсем на капельку увеличивает размер ехе.
    В архиве на сайте есть хорошие примеры использования.
     
    1 человеку нравится это.
  3. TDI
    клас, спс)
    действительно классная статья