C++
4 October 2010

Музыка из кейгенов. Как это работает?

Еще давно очень многих интересовал один вопрос: «Эта программа занимает всего 100 кб, что за музыку она воспроизводит? Как это работает?»

Так вот, называется это чудо – Трекерная музыка. И что самое главное – она занимает очень мало места, в отличие от .mp3 или .wav. В современных популярных ОС трекерные файлы (MOD, XM, S3M, IT и пр.) проигрываются большинством медиаплееров, например, Winamp, VLC, Amarok, Audacious и другими.

Скачать такую музыку можно, например отсюда — keygenmusic.net, или отсюда www.modarchive.org. Это отнюдь не единственные ресурсы, стоит только обратиться к поиску.

Для того, чтобы воспроизвести такую музыку в своей программе, нам потребуется минимальное знание C++, а также minifmod, доступный в исходниках. Как заявляют разработчики, minifmod добавит всего 50 кб к вашему exe-файлу (без учета сжатия).


Итак, краткая теория закончилась, приступаем к программированию. Для наших тестов – скачиваем все необходимое отсюда www2.zippyshare.com/v/26128618/file.html (в архиве исходники тестового проекта, сам minifmod, один музыкальный файл, конвертер, и пр.)

Этап 1. Нам необходимо заполучить композицию в формате *.xm либо* .mod (eсли у вас файл в формате *.mod – его необходимо перевести в формат .xm, воспользовавшись конвертором mod2xm)

Этап 2. Затем открываем Table extractor, меню File – Load и указываем наш файл *.xm. Настройки будут следующие:


После нажатия на кнопку Go!, в папке с файлом .xm, появится файл Result.txt. Переименуйте его в music.h и замените файл \loadmusic\music.h. В этом файле наш музыкальный трек, который мы будем воспроизводить.

Этап 3. Создаем новый проект, и подключаем к нему всё, что лежит в lib и loadmusic. Будем выглядеть это примерно так:


Этап 4. Т.к. в проекте файлы в старом стиле “C”, то студия требует, чтобы были отключены Precompiled Header, для этого в свойствах проекта их отключаем (в Visual Studio -> свойства поекта -> C/C++ — Precompiled Headers — Not Using Precompiled Headers)

Этап 5. Самое главное – осталось только включить музыку и пусть играет ))) Исходный файл точки входа у меня получился следующий:
#include <iostream>

#include "loadmusic\loadmusic.h"
#include "lib\minifmod.h"

#define WIN32_LEAN_AND_MEAN // this will assume smaller exe

FMUSIC_MODULE *mod;     // fmod music handler

using namespace std;

int main()
{
  cout << "Press 'p' to play music " << endl << "'s' to stop" << endl << "'e' to exit" << endl;

  char i('p');
  do
  {
    switch(i)
    {
    case 'p':
        if (mod == NULL) // mod handle is free? (thouh it will work fine with other loaded audio devices)
        {
          // We defined our music file to be loaded in LoadMusic.cpp //
          //=============================================================//
          loadmusic(); // Call & set ready memory to load the music
          if(!FSOUND_Init(44100, 0)) // intialize memory for sound
          {
            return 1;
          }

          mod = FMUSIC_LoadSong(NULL, NULL); // handle = LoadSong()
          FMUSIC_PlaySong(mod); // Play it (from memory)
        }

      break;
    case 's':
        if (mod != NULL) // handle is loaded (playing)?
        {
          FMUSIC_FreeSong(mod); // Free memory (handle)
          FSOUND_Close(); // Close it (stop it from playing)
          mod=NULL; // make handle to be Free again
        }
      break;
    }

    cin >> i;
  }
  while(i != 'e');
          
  if (mod != NULL) // music is on?
    {
      FMUSIC_FreeSong(mod); // Free it from memory (the handle - "mod")
      FSOUND_Close(); // Close Music
    }

  return 0;
}

* This source code was highlighted with Source Code Highlighter.


По-умолчанию музыка начинает сразу же играть. Если ввести ‘s’ – то она прекращается, ‘e’ – выходим из программы.

Какой же размер файла получился?
Тестирование проводил на VS 2010 Express Edition. Я установил использование статической линковки, после чего получился exe размером 166 кб. Для того, чтобы уменьшить размер – сжимаем его с помощью upx, с максимальной степенью сжатия -9. После сжатия файла, на выходе – файл размером 84 кб, что довольно неплохо!

UPD: возможно у кого-то не окажется студии под рукой, чтобы скомпиллировать. Вот готовый exe, размером 84 кб скачать

+52
27.7k 106
Comments 112
Top of the day