
Бывалый

Профиль
Группа: Участник
Сообщений: 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.
|
|