Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при записи MIDI файла, После записи файл не воспроизводиться. 
:(
    Опции темы
BEST13
Дата 20.10.2013, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 11.4.2008
Где: Ukraine

Репутация: нет
Всего: нет



Есть задача, записывать генерируемые звуки из выстроенных 100+ в Виндовс устройств. Само проигрывание звуков из всех инструментов я уже реализовал, в интернете не могу найти именно, нужного примере, всюду идет запись в *.wav файл, но данные обернуться со входа микрофона. а поскольку я сам воспроизвожу звуки, то на вход микрофона ничего не подается. Но в итоге, мне удалась, найти исходник похожей на мою программы, которая записывает в Midi файл, но к сожалению, этот файл не хочет воспроизводиться плеером. Выкидывает, ошибку что файл поврежден.
Что не так с записью? Или буду благодарен если, кто предложит, свой вариант или посоветует как это ревизовать, в крайнем в прицепи, подойдет любой звуковой формат, хоть вав хоть мп3. Главное записать.
Код

{********************************************************************|
|   Пример записи миди сообщений в стандартный midi-файл             |
|формата 0. Запись сохроняется в файл new.mid в текущей              |
|директории. Для игры используються клавиши 1..0                     |
|____________________________________________________________________|
|                                                                    |
|                      Автор: Mo-skin.                               |                     |
|  URL: [url]http://Last.h16.ru[/url] "Технологии прогаммирования миди"         |
|  mailto: [email][email protected][/email]                                         |
|   |
|********************************************************************|}
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils,  Classes, Graphics, Controls, Forms,
  Dialogs, MmSystem,   ExtCtrls, ComCtrls, StdCtrls;
 
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    TrackBar1: TTrackBar;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    ComboBox4: TComboBox;
    Button8: TButton;
    Timer2: TTimer;
    Button9: TButton;
    Edit1: TEdit;
    Timer1: TTimer;
    CheckBox1: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ComboBox1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure ComboBox2Change(Sender: TObject);
    procedure ComboBox3Change(Sender: TObject);
    procedure ComboBox4Change(Sender: TObject);
 
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
   
 
 
  
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
   
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
Form1   : TForm1;
 
F:TFileStream;
Tim:LongWord;
hMidi   :integer;
inst    :integer; // инструмент
midimsg :integer; // миди сообщение
no      :integer; // нота
vol     :integer = 127; // громкость
chan    :integer = 0;   // канал 0-9 , 9 - ударные
ok      : Array[1..4] of integer=(-48,-24,0,24);  //октавы
i       :integer =3; // номер октавы
ton     :Integer =0; // тональность
Instruments:array [0..127] of String=(     // массив имен инструментов
'AcousticGrandPiano','BrightAcousticPiano','ElectricGrandPiano',
'HonkyTonkPiano','ElectricPiano1','ElectricPiano2','Harpsichord','Clavinet',
'Celesta','Glockenspiel','MusicBox','Vibraphone','Marimba','Xylophone',
'TubularBells','Dulcimer',
'DrawbarOrgan','PercussiveOrgan','RockOrgan','ChurchOrgan',
'ReedOrgan','Accordion','Harmonica','TangoAccordion',
'AcousticNylonGuitar','AcousticSteelGuitar','JazzElectricGuitar',
'CleanElectricGuitar','MutedElectricGuitar','OverdrivenGuitar',
'DistortionGuitar','GuitarHarmonics','AcousticBass',
'FingeredElectricBass','PickedElectricBass','FretlessBass',
'SlapBass1','SlapBass2','SynthBass1','SynthBass2',
'Violin','Viola','Cello','Contrabass',
'TremoloStrings','PizzicatoStrings','OrchestralHarp','Timpani',
'StringEnsemble1','StringEnsemble2','SynthStrings1',
'SynthStrings2','ChoirAahs','VoiceOohs','SynthVoice','OrchestraHit',
'Trumpet','Trombone','Tuba','MutedTrumpet','FrenchHorn',
'BrassSection','SynthBrass1','SynthBrass2',
'SopranoSax','AltoSax','TenorSax','BaritoneSax',
'Oboe','EnglishHorn','Bassoon','Clarinet',
'Piccolo','Flute','Recorder','PanFlute','BlownBottle',
'Shakuhachi','Whistle','Ocarina',
'SquareLead','SawtoothLead','CalliopeLead','ChiffLead',
'CharangLead','VoiceLead','FifthsLead','BassandLead',
'NewAgePad','WarmPad','PolySynthPad','ChoirPad',
'BowedPad','MetallicPad','HaloPad','SweepPad',
'SynthFXRain','SynthFXSoundtrack','SynthFXCrystal','SynthFXAtmosphere',
'SynthFXBrightness','SynthFXGoblins','SynthFXEchoes','SynthFXSciFi',
'Sitar','Banjo','Shamisen','Koto','Kalimba',
'Bagpipe','Fiddle','Shanai',
'TinkleBell','Agogo','SteelDrums','Woodblock',
'TaikoDrum','MelodicTom','SynthDrum','ReverseCymbal',
'GuitarFretNoise','BreathNoise','Seashore','BirdTweet',
'TelephoneRing','Helicopter','Applause','Gunshot');
 
 
KeyP:array[0..255] of boolean ;  //массив, содежащий сведения о нажатых клавишах
a:integer;
 
implementation
 
{$R *.dfm}
procedure TimeWrite(T:LongWord);  //запись дельта-времени в виде величины переменной длинны
var
ab,an:array[0..3] of byte;
i:integer;
begin
 
ab[0]:=(T and $7F);     //первые семь бит числа
ab[1]:=(t and $3F80)div $100;
ab[2]:=(t and $1FC000) div $10000;
ab[3]:=(t and $FE00000) div $1000000; // четвертая семерка
 
 
for i:=3 downto 1 do   // запись начинается со старшего байта!!!!!
   begin
   if ab[i]<>0 then
      begin
      ab[i]:=ab[i]+$80;
      F.Write((ab[i]),1);
      end;
   end;
f.Write(ab[0],1);
end;
 
 
 
procedure TForm1.FormCreate(Sender: TObject);
var
ro:integer;
begin
a:=0;
midiOutOpen(@hmidi, 0, 0, 0, 0);//открытие миди-выхода
Form1.KeyPreview:= true;
For inst:=0 to 127 do
   begin
   ComboBox1.Items.Add(Instruments[Inst]); //загрузка списка инструментов в ComboBox1
   end;
 
 
end;
 
 
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
If not KeyP[ord(key)] then      //если клавиша не нажата
  begin
  if key='1' then no:=ok[i]+60+ton ; //c
  if key='2' then no:=ok[i]+62+ton ; //d
  if key='3' then no:=ok[i]+64+ton ; //e
  if key='4' then no:=ok[i]+65+ton ; //f
  if key='5' then no:=ok[i]+67+ton ; //g
  if key='6' then no:=ok[i]+69+ton ; //a
  if key='7' then no:=ok[i]+71+ton ; //b
  if key='8' then no:=ok[i]+72+ton ; //c
  if key='9' then no:=ok[i]+74+ton ; //d
  if key='0' then no:=ok[i]+76+ton ; //e
  if key='-' then no:=ok[i]+77+ton ; //f
  if key='=' then no:=ok[i]+79+ton ; //g
 
  //формируем сообщение
  midimsg := $90 + ((no) * $100) + (vol * $10000) +chan ;
  
   //отправляем его
   midiOutShortMsg (hmidi, midimsg);
if Timer2.Enabled then   //если включена запись
   begin
    TimeWrite(Tim);
    Tim:=0;
    F.Write(midimsg,3);
   end;
 
   KeyP[ord(key)]:=true;    //клавиша нажата
   end;
end;
 
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
midiOutClose(hmidi); //закрываем  midiOut при выходе из приложения
 
 
end;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
begin               //выбор инструмента
inst:=ComboBox1.Items.IndexOf(ComboBox1.Text);
 midimsg:=$C0+($100*inst);
midiOutShortMsg (hmidi, midimsg);
edit1.SetFocus;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
MidiOutClose(hmidi);
midiOutOpen(@hmidi,1, 0, 0, 0);
end;
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
 
vol:=TrackBar1.Position;
end;
 
procedure TForm1.ComboBox2Change(Sender: TObject);
begin                //выбор канала
chan:=ComboBox2.Items.IndexOf(ComboBox2.Text);
edit1.SetFocus;
end;
 
procedure TForm1.ComboBox3Change(Sender: TObject);
begin                //выбор октавы
i:=ComboBox3.Items.IndexOf(ComboBox3.Text)+1;
edit1.SetFocus;
end;
 
procedure TForm1.ComboBox4Change(Sender: TObject);
begin
ton:=ComboBox4.Items.IndexOf(ComboBox4.Text);
edit1.SetFocus;  //смена тональности
end;
 
 
 
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin               //отпускание клавиши
if key=ord('1') then no:=ok[i]+60+ton ; //c
if key=ord('2') then no:=ok[i]+62+ton ; //d
if key=ord('3') then no:=ok[i]+64+ton ; //e
if key=ord('4') then no:=ok[i]+65+ton ; //f
if key=ord('5') then no:=ok[i]+67+ton ; //g
if key=ord('6') then no:=ok[i]+69+ton ; //a
if key=ord('7') then no:=ok[i]+71+ton ; //b
if key=ord('8') then no:=ok[i]+72+ton ; //c
if key=ord('9') then no:=ok[i]+74+ton ; //d
if key=ord('0') then no:=ok[i]+76+ton ; //e
if key=ord('-') then no:=ok[i]+77+ton ; //f
if key=ord('=') then no:=ok[i]+79+ton ; //g
 
//формируем сообщение
midimsg := $80 + ((no) * $100) + (vol * $10000) +chan ;
//отправляем его
midiOutShortMsg (hmidi, midimsg);
if Timer2.Enabled=true then
   begin
    TimeWrite(Tim);
   Tim:=0;
   F.Write(midimsg,3);
   end;
KeyP[key]:=false; //клавиша отжата
end;
 
 
 
 
 
 
procedure TForm1.Button8Click(Sender: TObject);
var
mb:byte;
lw:LongWord;
FL:File;
begin
DeleteFile('new.mid');
AssignFile(FL,'new.mid');
Rewrite(FL);
CloseFile(FL);
 
 
 
 
F:=TFileStream.Create('new.mid',fmOpenWrite);
 
LW:=$6468544D;  //MThd
F.Write(LW,4);
LW:=$06000000;
F.Write(LW,4);
LW:=$01000000;
F.Write(LW,4);
LW:=$6000;
F.Write(LW,2);
 
LW:=$6B72544D ;//MTrk
F.Write(LW,4);
LW:=$FFFF0000;  //размер MTrk
F.Write(LW,4);
 
LW:=$0458FF00;   // установка
F.Write(LW,4);
LW:=$20180204;   // размера
F.Write(LW,4);
 
f.Seek(30,0);
mb:=0;
F.Write(mb,1);
mb:=$C0;        // Установка 
F.Write(mb,1);  
mb:=$01;        // инструмента № 1
F.Write(mb,1);
Tim:=0;
Timer2.Enabled:=true;
 
end;
 
procedure TForm1.Button9Click(Sender: TObject);
var
fb:byte;
begin
fb:=$FF;     //$FF2F00 - конец трека
F.Write(fb,1);
fb:=$2F;
F.Write(fb,1) ;
fb:=$00;
F.Write(fb,1)  ;
F.Free;
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
inc(Tim,3)
end;
 
 
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
MidiOutShortMsg(hmidi,$7F3e99);
end;
 
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
If timer1.Enabled then Timer1.Enabled:=false else Timer1.Enabled:=true;
end;
 
end.

PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0679 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.