Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

программный MIDI синтезатор


Страницы:   1 2

SFproG ©   (2005-02-01 18:16:00) 

Кто нибудь знает коды всех нот для извлечения их из программы?
Например, для извлечения ноты "До" я пишу такой код:

procedure TForm1.Button1Click(Sender: TObject);
begin
midimsg:=$7f3c90; // "$7f3c90" - нота "до" //
midioutshortmsg(hmidi_out,midimsg);
end;

Это коды всех нот которые я знаю:

$7f3a90 - ля#
$7f3b90 - си
$7f3c90 - до
$7f3d90 - до#
$7f3e90 - ре
$7f3f90 - ре#

Не хватает ещё шесть. Подскажите кто знает. Заранее спасибо...


toshbek   (2005-04-12 20:46:00) [1]

Подскажите, как в данном примере бороться с переполнением буфера клавы.
И как можно сохранить извлекаемые звуки в файл (midi или wav)?


Ivolg   (2005-03-01 11:54:00) [2]

Попробуй так:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, MMsystem;

type
 TForm1 = class(TForm)
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormKeyUp(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
hmidi_out: HMIDIOUT;
hmidi_in:  HMIDIIN;
err_cd: integer;
midimsg: DWORD;
Down:boolean;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  midimsg:=$7f3a90; // "$7f3c90" - íîòà "äî" //
  midioutshortmsg(hmidi_out,midimsg);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   err_cd:=midioutopen(@hmidi_out,1,0,0,0);
   down:=true;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
  down:=true;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
   if Down then begin
   if key=VK_RETURN then
   midimsg:=$7f3b90; // "$7f3c90" - íîòà "äî" //
   midioutshortmsg(hmidi_out,midimsg);
   Down:=false;
end;
end;
end.
У меня все нормально работает!


SFproG   (2005-02-27 10:23:00) [3]

Т.е.?
Помоему, в этой теме всё описано как делать музыку в делфи.


axz   (2005-02-26 21:08:00) [4]

КТО МНЕ РАССКАЖЕТ КАК ДЕЛАТЬ МУЗЫКУ  MIDI
В дельфах?


SFproG   (2005-02-08 20:23:00) [5]

Да, компонент очень пригодился. От кучи проблем избавил. И исходник полезный. Спасибо за ссылку


wnew   (2005-02-07 18:33:00) [6]

SFproG ©   (06.02.05 22:50) [17]
Какой исходник? Это полноценный компонент, отлично работающий, и лёгкий в использовании.
Да, исходник прилагается и, если уж тебе нужен чистый API - можешь просмотреть исходник и выяснить необходимые детали. Также прилагается хороший пример.

TMidiGen v.2.1  FWS 380 Kb 4 Jun 2002
By Alan Warriner. An update which overcomes the memory allocation problems encountered with some MIDI drivers. TMidiGen is a MIDI component which allows the simple creation of sound effects and note sequences within an application without the need for external files or resources. This is achieved by generating the MIDI data in memory.
TMidiGen provides:
175 instruments available from the vast majority of sound cards.
Advanced Pitch Bend, Modulation, Sustain, Chorus and Reverb effects.
Easy Volume and Pan adjustment.
Simple method of playing individual notes.
Note sequences can be assembled in strings to provide chords and tunes.
Sound duration variable in 10mS steps.
Easy creation of sound loops.
Demo application and help file included.
Fully functional
Source: Included
Exe-demo included


Download: CB4 CB5 CB6 D4 D5 D6  

http://www.torry.net/authorsmore.php?id=3389&SID=49f1d35596442a0ac4f7cf15b6fecac1


SFproG   (2005-02-06 22:50:00) [7]

Digitman ©  
Спасибо. Я бы сам такое не придумал. Займусь изучением теории.

wnew ©  
Прикольный исходник...


wnew   (2005-02-06 18:36:00) [8]

http://www.torry.net/quicksearchd.php?SID=49f1d35596442a0ac4f7cf15b6fecac1&String=MidiGen&Title=Yes


Digitman   (2005-02-04 16:27:00) [9]

"караул устал !" (с)

var Key QAlreadyPressed: Boolean; //тот самый флаг, блиннн !!!

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
//извлечение ноты До кл.Q
if (key = 81) and not (KeyQAlreadyPressed)then
begin
  KeyQAlreadyPressed := True;
  midimsg:=$7f3090;
  midioutshortmsg(hmidi_out,midimsg);
end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
//закрытие извлеч. ноты До отпусканием кл.Q
if (key = ord(81)) then
   begin
    KeyQAlreadyPressed := False;
   midimsg:=$7f3080;
   midioutshortmsg(hmidi_out,midimsg);
   end;
end;

да неужто так сложно дотумкать самому ?!


SFproG   (2005-02-04 16:15:00) [10]

Ты немного вопрос не так понял.
 То что ты описал это я давно сделал.

 Вот примерный код моей программы:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Buttons, MMSystem, ExtCtrls;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure FormKeyUp(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 hmidi_out: HMIDIOUT;
 hmidi_in:  HMIDIIN;
 err_cd: integer;
 midimsg: DWORD;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//открытие миди выхода
err_cd:=midioutopen(@hmidi_out,1,0,0,0);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
//извлечение ноты До кл.Q
 if key = 81 then
 begin
   midimsg:=$7f3090;
   midioutshortmsg(hmidi_out,midimsg);
 end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 //закрытие извлеч. ноты До отпусканием кл.Q
 if (key = ord(81)) then
    begin
    midimsg:=$7f3080;
    midioutshortmsg(hmidi_out,midimsg);
    end;
end;

end.

 Вопрос я имел ввиду такой: почему при зажатии (не "нажатии"), т.е. при длительном ударжании клавиши, идёт непрерывное звучание ноты, точнее "треск". Как сделать чтобы она прозвучала один раз? Вот.  

 А теорию я люблю, но без "примеров" изучение происходит сложнее. Думаю, с этим ты со мной согласишься.


SFproG   (2005-02-04 16:15:00) [11]

Ты немного вопрос не так понял.
 То что ты описал это я давно сделал.

 Вот примерный код моей программы:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Buttons, MMSystem, ExtCtrls;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure FormKeyUp(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 hmidi_out: HMIDIOUT;
 hmidi_in:  HMIDIIN;
 err_cd: integer;
 midimsg: DWORD;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//открытие миди выхода
err_cd:=midioutopen(@hmidi_out,1,0,0,0);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
//извлечение ноты До кл.Q
 if key = 81 then
 begin
   midimsg:=$7f3090;
   midioutshortmsg(hmidi_out,midimsg);
 end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 //закрытие извлеч. ноты До отпусканием кл.Q
 if (key = ord(81)) then
    begin
    midimsg:=$7f3080;
    midioutshortmsg(hmidi_out,midimsg);
    end;
end;

end.

 Вопрос я имел ввиду такой: почему при зажатии (не "нажатии"), т.е. при длительном ударжании клавиши, идёт непрерывное звучание ноты, точнее "треск". Как сделать чтобы она прозвучала один раз? Вот.  

 А теорию я люблю, но без "примеров" изучение происходит сложнее. Думаю, с этим ты со мной согласишься.


Digitman   (2005-02-04 14:47:00) [12]


> Везде одна теория, ни каких примеров


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

вот ты, к примеру, спросил


> как сделать чтобы при нажатии кнопки, извлечение звука происходило
> один раз


ну ведь в этом ресурсе ЧЕРНЫМ ПО БЕЛОМУ написано

Note Off
8n kk vv kk=номер клавиши (0 – 127)
Note On
9n kk vv

ЧТО тебе в этом непонятно, а ?

клавиша нажата (OnKeyDown) ? -  это Note On !
клавиша отпущена (OnKeyГз) ? -  это Note Off !

так  уж видать сложно дотумкать, где, к примеру, в команде 7f3a 90 указывается. нажата ли клавиша или отпущена она ?

мозжечком, мил мой, РАБОТАТЬ НАДО ! а не носить его под шапкой))


SFproG   (2005-02-04 12:29:00) [13]

Согласен, на баянную раскладку клавиатура PC очень походит. Но и под клавиши пианино может косить.

 По ссылке [1] я ходил и плюс ещё некоторую информацию пособирал в инете. Везде одна теория, ни каких примеров. Поэтому пока ни чего не могу сообразить.
 Может что нибудь с Timer-ом придумаю. Например, чтобы он через 1сек отключал зажатую клавишу.


Digitman   (2005-02-04 08:35:00) [14]


> SFproG ©   (03.02.05 18:12) [9]


если уж на то пошло, то PC-клавиатура больше похожа на баянную клавиатуру, так что лучше уж сделать раскладку нот в соответствии с баянной


> как сделать чтобы при нажатии кнопки, извлечение звука происходило
> один раз, а непрерывное. Подскажите, если кто знает.


я ж тебе сказал уже : то что ты называешь "кодами нот" - это не чисто коды нот, а целые MIDI-команды, в составе которых есть и эти коды !

ты по ссылке в [1] ходил ? там же черным по белому расписаны форматы различных команд !


SFproG   (2005-02-03 18:12:00) [15]

Да, пианино это серьёзный инструмент, который просто так не заменишь.  

  Хочу сделать прогу у которой расположение клавиш будет анологично расположения пианино. Практика игры на этой проге, думаю, почти может заменить для меня игру на клавишах пианино (хоть и не на всех клавишах).  
 Например, от Tab до Enter это уже две октавы, поэтому кроме "чижика-пыжика" можно сыграть уже что-то более посложнее и интереснее. А если ещё подключить зажатие Shift или Caps lock... Можно вообще старую ненужную PC-клавиатуру переделать и перекрасить в белые и чёрные клавиши; подключить нормальные колонки и тогда я думаю пианино и др. клавишные инструменты у тебя уже дома (хоть и с некоторым отличием).  

 Проги типа ModPlugTracker отличные. Но хочется попытаться сделать что-то своё ради интереса к программированию.

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


Asteroid   (2005-02-03 14:22:00) [16]

Могу только подтвредить
>  клавиатура ПК вместо полноценной MIDI-клавиатуры позволит сыграть разве что "чижик-пыжик"

В комплекте к звуковой карте была прога MIDI Keyboard, которая давала играть на клавиатуре компа (с расположением клавиш аналогично пианино). Итог - полторы октавы + геморрой с всюду белыми клавишами.
P.S. Если хочешь что-то сочинить, попробуй ModPlugTracker или любой другой трекер. И возможностей побольше, чем у MIDI. Писать что-то свое здесь имеет смысл только для тренировки.


Digitman   (2005-02-03 10:34:00) [17]


> Синтезация звуков мне не нужна


как это "не нужна" ?

а это (midioutshortmsg) тогда зачем вызываешь ?)


> чтобы была замена пианино


ну, положим, "пианино" ты никак не заменишь - это все-таки серьезный муз.инструмент .. а клавиатура ПК вместо полноценной MIDI-клавиатуры позволит сыграть разве что "чижик-пыжик")


SFproG   (2005-02-02 20:37:00) [18]

Синтезация звуков мне не нужна. Мне нужна игра на клавишах, чтобы была замена пианино и т.п.

 Да, может и на самом деле очередной велосипед получится. Просто хочется сделать свою программу на свой вкус.

 С нажатием и отжатием клавиш я разобрался. На счёт переменной у меня наверное теор.знаний не хватит, но попробую подумать. Хотя, подсказки бы не помешали.


Digitman   (2005-02-02 18:02:00) [19]


> прогу, которая полностью бы заменила настоящий синтезатор
> (покупать дорого)


синтезатор - это отнюдь не доска с клавишами.
синтезатор может быть и без клавиш, но от этого он не перестает быть синтезатором.
яркий пример - аудиокарта в твоем компе содержит у себя на борту встроенный FM-синтезатор и прекрасно синтезирует свуки даже без твоей "проги" и безо всяких клавиш.


> Если зажата эта кнопка клавы, то происходит непрерывное
> звучание этой ноты


а завести какую-то переменную, хранящую признак, была ли ранее уже нажата клавиша - не судьба ? и, кстати, OnKeyPress  для этого дела вообще не подходит .. OnKeyDown + OnKeyUp !


> Думаю прога получится классная


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

скачай себе из Инета какую-либо готовую "прогу" на эту тему.


SFproG   (2005-02-02 14:56:00) [20]

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

 Тут ещё одна небольшая проблема возникла. Пишу:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (key = 'й') or (key = 'q')then //нота "до" первой октавы
  begin
  midimsg:=$7f3090;
  midioutshortmsg(hmidi_out,midimsg);
  end;
end;  
 Если зажата эта кнопка клавы, то происходит непрерывное звучание этой ноты. А надо что бы звук извлекался один раз.
 И ещё как сделать событие на отжатие кнопки?
 Если знаешь подскажи, пожалуйста. Думаю прога получится классная.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо