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

Трекерная музыка (2 стр)

Страницы: 1 2
#15
20:57, 11 сен. 2011

TarasB
> > В ресурсах.
> Это хреново.
Как правило это WAV формат без заголовка, то есть чистые звуковые данные, их можно взять из PCM-WAV-файла начиная с 44-го байта, их можно напрямую загружать в DirectSound Buffer.

#16
21:15, 11 сен. 2011

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

TarasB.rc
1 rcdata "pifpaf.wav"

brcc32.exe TarasB.rc

{$R TarasB.res}

function MyPlaySound(ID: integer): boolean;
var
  hData: HGLOBAL;
  hRes: HRSRC;
begin
  Result := false;
  hRes := FindResource(hInstance, MAKEINTRESOURCE(ID), RT_RCDATA);
  if hRes <> 0 then begin
    hData := LoadResource(hInstance, hRes);
    if hData <> 0 then begin
      Result := sndPlaySound(LockResource(hData), SND_MEMORY or SND_ASYNC or SND_NODEFAULT);
    end;
  end;
end;
#17
18:29, 13 сен. 2011

А миди звуки,по-твоему,что из воздуха берутся?Там же тоже библиотеки используются,с той лишь разницей что они по умолчанию присутствуют.

#18
19:10, 13 сен. 2011

Bioman
> Там же тоже библиотеки используются,с той лишь разницей что они по умолчанию
> присутствуют.

Вот в этой "лишь разнице" всё дело. Что любая программа может в пару строк сыграть звук из стандартного набора, и не надо ничего скачивать.

#19
22:17, 13 сен. 2011

TarasB
пробежался по треду и вставлю свои 5 копеек:

1)трекерная музыка это форматы:
.xm *.s3m *.mod итд - по моей памяти создавались для компов амига.

скачай спеку по ним и ты поймешь всю широту глубин

я помню когда был маленький и писал на делфи - написал свой собственный плеер mod файлов не используя библиотеки и там далеко не 100 строк :)))
на скока я знаю ты тоже на дельфи пишешь - могу скинуть если надо - но сразу говорю коду лет 7

2)в виндовс НИКОГДА небыло поддержки трекерной музыки на уровне апи

3)midi - это не трекерная музыка - это просто midi - отдельная весч

#20
22:32, 13 сен. 2011

fsmoke
> 3)midi - это не трекерная музыка - это просто midi - отдельная весч

Я знаю. В этом и беда.

fsmoke
> 2)в виндовс НИКОГДА небыло поддержки трекерной музыки на уровне апи

Короче, я понял, что готовый набор звуков из семёрки убрали для удобства пользователей, лол.

fsmoke
> я помню когда был маленький и писал на делфи - написал свой собственный плеер
> mod файлов не используя библиотеки

Жестоко, вручную звуковые волны генерировать... У меня пока только жутковатый монохромат получается, и то с откровенными щелчками в те моменты, когда надо подавать новую порцию байтов.

#21
22:46, 13 сен. 2011

Ну значит играй мп3.
Не хочешь включать мозг и разбираться - не судьба.

#22
0:10, 16 сен. 2011

Есть книжка (наконец-то я раскопал её название  у себя в залежах)  "Руководство программиста по работе со звуком", Тим Кинтцель. Там целая глава  про FM синтез инструментов. И про трекерную музыку глава есть.

#23
12:59, 17 сен. 2011

Если еще актуально.
TarasB
> И всё было нормально, пока из Вин7 не выдрали регулятор миди.
>Короче, я понял, что готовый набор звуков из семёрки убрали для удобства пользователей, лол.

У меня на семерке вроде играло. В выходной правда проверить не могу.
Но могу сказать, что напоролся на "проблему". По умолчанию (0-е устройство) в 7ке выход midi оказался настроен не на программный синтезатор (вот он звуки и содержит/играет), а на аппаратный midi-интерфейс MPU-401.  И в результате играло в пустоту.
Можно явно указать с каким устройством вывода работать (второй аргумент midiOutOpen), но у Вас я этого в коде инициализации не вижу. Я тоже схалявил и просто отрубил MPU-401 в настройках Винды. И все заработало. Может у Вас тоже самое?
Ну и мой говнокод:

unit MIDIUn;
//  модуль управления MIDI

interface
uses mmsystem, windows;

procedure SetInstrument(channel, instrument:byte); // выбираем инструмент для канала
procedure NoteOn(channel, notenum, volume:byte); // включаем ноту
procedure NoteOff(channel, notenum:byte); // выключаем ноту
procedure MIDIClose; // отключаемся от синтезатора
procedure MIDIInit; // подключаем первый попавший в системе синтезатор

type
  TMIDICode=record
    case integer of
      0: (data:dword);
      1: (bytes:array[0..3] of byte);
  end;

var
  MIDICode:TMIDICode;
  mididev:HMIDIOUT=0;

implementation

procedure SetInstrument(channel, instrument:byte);
begin
  MIDICode.bytes[0]:=$C0+channel;
  MIDICode.bytes[1]:=instrument;
  MIDICode.bytes[2]:=0;
  MIDICode.bytes[3]:=0;
  midiOutShortMsg(mididev,MIDICode.data);
end;

procedure NoteOn(channel, notenum, volume:byte);
begin
  MIDICode.bytes[0]:=$90+channel;
  MIDICode.bytes[1]:=notenum;
  MIDICode.bytes[2]:=volume;
  MIDICode.bytes[3]:=0;
  midiOutShortMsg(mididev,MIDICode.data);
end;

procedure NoteOff(channel, notenum:byte); // выключаем ноту
begin
  MIDICode.bytes[0]:=$80+channel;
  MIDICode.bytes[1]:=notenum;
  MIDICode.bytes[2]:=127;
  MIDICode.bytes[3]:=0;
  midiOutShortMsg(mididev,MIDICode.data);
end;

procedure MIDIClose;
begin
  if mididev<>0 then   midiOutClose(mididev);
end;

procedure MIDIInit;
var devcnt:integer;
begin
  mididev:=0;
  devcnt:=midiOutGetNumDevs;
  if devcnt=0 then exit; // для GD - да, здесь нет сигнализации об ошибке :-)
  midiOutOpen(@mididev,0,0,0,CALLBACK_NULL);
end;

end.

Страницы: 1 2
ПрограммированиеФорумЗвук

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