Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Вниз

программный MIDI синтезатор   Найти похожие ветки 

 
SFproG ©   (2005-02-01 18:16) [0]

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

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

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

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

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


 
Digitman ©   (2005-02-02 09:43) [1]


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


это не "коды нот", это команды управления MIDI-устройством
а собственно "код ноты" в данных командах хранится в старшем байте младшего слова, только это не "код ноты", а , если угодно, "номер клавиши" в диапазоне 0..127 ($00..$7F)


> Не хватает ещё шесть


и что ты собрался "сыграть" 12-ю нотами ? разве что только "Чижик-пыжик" ?)

тебе сюда
http://www.midi.ru/doc/7.htm

и в станд.справку к ф-ции midiOutShortMsg() ..


 
SFproG ©   (2005-02-02 11:30) [2]

Спасибо большое! Разобрался.  

 Ест-но, на 12-ти нотах (1 октава) ни чего не сыграешь. У меня были планы сделать несколько октав.  

 Спасибо ещё раз.


 
Digitman ©   (2005-02-02 11:51) [3]


> SFproG ©   (02.02.05 11:30) [2]


а зачем весь этот геморрой тебе нужен ?


 
SFproG ©   (2005-02-02 14:56) [4]

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

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


 
Digitman ©   (2005-02-02 18:02) [5]


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


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


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


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


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


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

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


 
SFproG ©   (2005-02-02 20:37) [6]

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

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

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


 
Digitman ©   (2005-02-03 10:34) [7]


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


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

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


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


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


 
Asteroid ©   (2005-02-03 14:22) [8]

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

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


 
SFproG ©   (2005-02-03 18:12) [9]

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

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

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

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


 
Digitman ©   (2005-02-04 08:35) [10]


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


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


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


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

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


 
SFproG ©   (2005-02-04 12:29) [11]

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

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


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


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


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

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


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


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

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

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

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

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

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


 
SFproG ©   (2005-02-04 16:15) [13]

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

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

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) [14]

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

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

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 16:27) [15]

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

var KeyQAlreadyPressed: 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;

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


 
wnew ©   (2005-02-06 18:36) [16]

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


 
SFproG ©   (2005-02-06 22:50) [17]

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

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


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

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-08 20:23) [19]

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


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

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


 
SFproG ©   (2005-02-27 10:23) [21]

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


 
Ivolg ©   (2005-03-01 11:54) [22]

Попробуй так:
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.
У меня все нормально работает!


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

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



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.036 c
1-1123147749
Dust
2005-08-04 13:29
2005.08.21
помогите разобраться с Critical Sections


4-1119960682
Ньюб
2005-06-28 16:11
2005.08.21
как выставить разрешения на папку с файлами в ntfs


1-1122828349
Destroyer
2005-07-31 20:45
2005.08.21
Вопрос по try ... except


4-1119855411
Dot
2005-06-27 10:56
2005.08.21
Как создать линк?


14-1122461517
dreamse
2005-07-27 14:51
2005.08.21
Программа для автоматического добавления софта в каталоги





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский