Войти
ПрограммированиеФорумЗвук

Трекерная музыка

Страницы: 1 2 Следующая »
#0
16:21, 11 сен. 2011

Я начну издалека.
Итак, есть такой модуль у меня.

unit Sounds;

interface

uses
  MMSystem;

procedure Sound(Nota: byte);
procedure DeSound(Nota: byte);
procedure NoSound;

procedure SetStyle(Style: byte);
procedure SetVolume(aVolume: byte);
procedure SetChanel(aChanel: byte);
procedure InitSounds;
procedure CloseSounds;

implementation

var
  hmidi: integer;
  Volume: array [0 .. 15] of byte;
  Chanel: byte;
  IsSound: array [0 .. 15] of boolean;

procedure Sound;
begin
  MidiOutShortMsg(hMidi, $90 or Chanel or Nota shl 8 or Volume[Chanel] shl 16);
end;

procedure DeSound;
begin
  MidiOutShortMsg(hMidi, $80 or Chanel or Nota shl 8);
end;

procedure NoSound;
var
  aNota: byte;
begin
 for aNota := 0 to 127 do
    MidiOutShortMsg(hMidi, $80 or Chanel or aNota shl 8);
end;

procedure SetStyle;
begin
  MidiOutShortMsg(hmidi, Style shl 8 or $C0 or Chanel);
end;

procedure SetVolume;
begin
  Volume[Chanel] := AVolume;
end;

procedure SetChanel;
begin
  Chanel := AChanel;
end;

procedure InitSounds;      
var
  i: integer;
begin
  MidiOutOpen(@hmidi,0,0,0,0);
  MidiOutShortMsg(hmidi, $5C0);
  Volume[Chanel] := $FF;
  Chanel := 0;
  for i := 0 to 15 do
    IsSound[i] := False;
end;

procedure CloseSounds;  
begin
  MidiOutClose(hmidi);
end;

end.
Это модуль для работы с миди-звуком.

И есть у меня, допустим, такая программа:

uses sounds,windows;
begin
  initsounds;
  setchanel(1);
  setstyle(127);
  setvolume(127);
  sound(50);
  sleep(1000);
  closesounds;
end.
Она издаёт звук ружья.

Всё, как видите, очень просто.
И всё было нормально, пока из Вин7 не выдрали регулятор миди. Говорят, что есть какая-то трекерная музыка, которую генерируют 2-килобайтовые кряки, и которая качественнее и работает везде, причём одинаково. Есть ли такой же простой способ работы с трекерным звуком?

#1
16:40, 11 сен. 2011

TarasB
> Есть ли такой же простой способ работы с трекерным звуком?

http://www.un4seen.com/

#2
17:41, 11 сен. 2011

0iStalker
> http://www.un4seen.com/

Вот выложи так же пример программы, издающей звук не из внешнего файла, не более 100 строк. Там по ссылке, судя по количеству фич, совсем не то, что мне надо, там какая-то огромная библиотека.

#3
18:35, 11 сен. 2011

Ты похоже не понимаешь, что есть трекерная музыка

#4
18:43, 11 сен. 2011

0iStalker
> Ты похоже не понимаешь, что есть трекерная музыка

Понимал бы, не спрашивал бы.
Я так понял, что это способ издавать звуки, не имея внешних файлов.
Просто покажи, как, ничего не скачивая, заставить комп под семёркой издать какой-нибудь звук. Для хрюши способ я показал - ты можешь скопировать тот код и он сразу скомпилируется, модуль MMSystem - это часть WinAPI, его качать не надо.

#5
18:50, 11 сен. 2011

TarasB
> Я так понял, что это способ издавать звуки, не имея внешних файлов.

Ты не правильно понял, - трекерная музыка подобна midi музыке, но сэмплы надо таскать с собой в файле, вместе с описание того, как эти семплы проигрывать и с какими эффектами. В итоге получается достаточно качественно при скромном объеме.

#6
18:57, 11 сен. 2011

0iStalker
> но сэмплы надо таскать с собой в файле

Можно прямо в екзешнике, в разделе констант?

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

#7
18:59, 11 сен. 2011

TarasB
> прямо в екзешнике, в разделе констант?
В ресурсах.

#8
19:01, 11 сен. 2011

Берешь ModPlug Tracker, создаешь модуль, подсовываешь его (можешь предварительно перевести в текстовый массив) BASS'у, PROFIT!!! Никто, в здравом уме, программным способом мелодию (в траве сидел кузнечик и собачий вальс не в счёт) создавать не будет, имея для этого специальный софт.

#9
19:01, 11 сен. 2011

Mikle
> В ресурсах.

Это хреново. То есть чтобы её зашить в екзешник, я должен с бубном плясать с редактором ресурсов, а чтобы сыграть, надо какую-то хрень с хендлами разводить.

0iStalker
> Берешь ModPlug Tracker, создаешь модуль, подсовываешь его (можешь
> предварительно перевести в текстовый массив) BASS'у, PROFIT!!!

Берёшь AAA, генерируешь BBB, переводишь в CCC, подсовываешь в DDD, как всё просто.
Я не хочу качать огромные библиотеки, тогда смысла нет никакого, буду на миди сидеть.
Я не хочу писать дохрена лишнего кода только потому, что микрософт убрал единственное (так, по-твоему получается) средство на халяву генерировать любой нужный звук.

Просто покажи пример кода не более чем 100 строк, который издаёт звук.

#10
19:15, 11 сен. 2011

Из файла

HMUSIC mus;
char filename[] = "test.s3m";

mus = BASS_MusicLoad(FALSE, filename, 0, 0, BASS_MUSIC_SURROUND, 0);
if (!mus) 
{
    // ...обработка ошибки... 
    return;
}

while (!kbhit() && BASS_ChannelIsActive(mus) != BASS_ACTIVE_STOPPED) 
{
    Sleep (200);
} 


BASS_ChannelStop(mus);

BASS_MusicFree(mus);


Из буффера

HMUSIC mus;
const char musdata[] = {0x..., ...., };

mus = BASS_MusicLoad(TRUE, musdata, 0, 0, BASS_MUSIC_SURROUND, 0);
if (!mus)  return;

while (!kbhit() && BASS_ChannelIsActive(mus) != BASS_ACTIVE_STOPPED) 
{
    Sleep (200);
} 


BASS_ChannelStop(mus);

BASS_MusicFree(mus);

TarasB
> Берёшь AAA, генерируешь BBB, переводишь в CCC, подсовываешь в DDD, как всё
> просто.

Нет, не ААА берешь, а софт для создания музыки, каким пользуются музыканты,... а если появляется какое-то другое желание, просто убейся об стену, чтобы другим людям не создавать проблем.

#11
19:20, 11 сен. 2011

0iStalker
> Нет, не ААА берешь, а софт для создания музыки, каким пользуются музыканты,...

Чего? Создавать звуки специальным софтом? Для создания звука из 0 поста я никакого софта не использовал.

0iStalker
> ... а если появляется какое-то другое желание, просто убейся об стену, чтобы
> другим людям не создавать проблем.

Проблему создал микрософт, так что убейся ты.

0iStalker
> HMUSIC mus;

Что это за тип, в каком модуле он описан? Заметь, я, вообще-то, привёл ПОЛНОСТЬЮ РАБОЧИЙ КОД.

#12
19:31, 11 сен. 2011

TarasB
Так тебе чо надо, просто звук проиграть?

#13
19:38, 11 сен. 2011

TarasB
> Проблему создал микрософт, так что убейся ты.

Проблема в твоем упрямстве и ЧСВ, так что таки ты убейся... или учись работать с людьми, а не с твоими древними и тормозными железяками

> Для создания звука из 0 поста я никакого софта не использовал.

Что толку от звука, если он не какая-то конкретная музыка/спецэффект? При чем тут микрософт, если ты сам туп, как пробка?

#include <windows.h>
#include <mmreg.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")

int main(int argc, char *argv[])
{
  char buf[88];
  for (int i=0; i<22; i++) buf[i] = 0xff;
  for (int i=0; i<22; i++) buf[i+22] = 0;
  for (int i=0; i<22; i++) buf[i+44] = 0xff;
  for (int i=0; i<22; i++) buf[i+66] = 00;

  HWAVEOUT hwout(0);
  WAVEFORMATEX hwfex;
  hwfex.wFormatTag = WAVE_FORMAT_PCM;
  hwfex.nChannels = 1;
  hwfex.nSamplesPerSec = 44100;
  hwfex.nAvgBytesPerSec = 44100;
  hwfex.nBlockAlign = 2;
  hwfex.wBitsPerSample = 8;
  hwfex.cbSize = sizeof(WAVEFORMATEX);

  WAVEHDR whdr;
  
  
  waveOutOpen(&hwout, WAVE_MAPPER, &hwfex, 0, 0, CALLBACK_NULL);  
  
  for (int i = 0; i<10000; i++)
  {
    memset(&whdr, 0, sizeof(whdr));
    whdr.lpData = (char *)buf;
    whdr.dwBufferLength = sizeof(buf);
    whdr.dwFlags = WHDR_INQUEUE;
    waveOutPrepareHeader(hwout, &whdr, sizeof(WAVEHDR));
    waveOutWrite(hwout, &whdr, sizeof(WAVEHDR));
  }

  Sleep(3000);
  


  return 0;
}

ЗЫ.
Чтобы ты чего не подумал, - это мой собственный код, написаный пару лет назад - http://www.gamedev.ru/flame/forum/?id=123344

#14
20:26, 11 сен. 2011

0iStalker
> ЧСВ
0iStalker
> Ты похоже не понимаешь, что есть трекерная музыка
0iStalker
> просто убейся об стену
0iStalker
> ты сам туп, как пробка

Хамить будешь своей маме в сортире, парниша, потому что она тебя походу не научила нормально разговаривать. У тебя всегда в глазах темнеет от злобы, когда видишь, что кто-то никогда не слышал о том, что элементарно для тебя?

0iStalker
> Что толку от звука, если он не какая-то конкретная музыка/спецэффект?

Это звук выстрела из ружья, он полезен в играх. Я и сразу это написал, ты бы это прочитал, но ты так увлёкся самолюбованием, что не смог прочитать.

0iStalker
> Чтобы ты чего не подумал, - это мой собственный код, написаный пару лет назад

Код заработал (через писиспикер пошёл?), спасибо.
(код на дельфи:

uses Windows, MMSystem;

var
  buf: array [0..87] of byte;
  i: integer;
  hwout: HWAVEOUT;
  hwfex: TWAVEFORMATEX;
  whdr: WAVEHDR;

begin

  for i := 0 to 87 do case i of
    0..21, 44..65: buf[i] := $FF;
    else buf[i] := 0;
  end;
  hwout := 0;

  hwfex.wFormatTag := WAVE_FORMAT_PCM;
  hwfex.nChannels := 1;
  hwfex.nSamplesPerSec := 44100;
  hwfex.nAvgBytesPerSec := 44100;
  hwfex.nBlockAlign := 2;
  hwfex.wBitsPerSample := 8;
  hwfex.cbSize := sizeof(TWAVEFORMATEX);
  
  waveOutOpen(@hwout, WAVE_MAPPER, @hwfex, 0, 0, CALLBACK_NULL);
  
  for i := 0 to 9999 do begin
    FillChar(whdr, sizeof(whdr), 0);
    whdr.lpData := PChar(@buf);
    whdr.dwBufferLength := sizeof(buf);
    whdr.dwFlags := WHDR_INQUEUE;
    waveOutPrepareHeader(hwout, @whdr, sizeof(WAVEHDR));
    waveOutWrite(hwout, @whdr, sizeof(WAVEHDR));
  end;

  Sleep(3000);
end.

Страницы: 1 2 Следующая »
ПрограммированиеФорумЗвук

Тема в архиве.