Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2010, 15:26   #1
Dancewithevil
Пользователь
 
Регистрация: 14.03.2010
Сообщений: 18
Смущение Синтезатор на Delphi. Проблема с непослушными клавишами

Доброго времечка. Ребята есть вопрос по созданию синтезатора. Я столкнулся вот с такой проблемой:
При привязке клавиш к кнопкам, обнаружил, что когда я выставляю значение, допустим:
Код:
...
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char);
if key=1 then no:=56; // no - integer тип нота всё объявил как положено в 
//переменных
if key=2 then no:=58 ;
if key=3 then no:=60 ;
if key=4 then no:=62 ;
if key=5 then no:=64 ;
if key=6 then no:=68;
if key=7 then no:=70 ;
if key=8 then no:=72 ;
if key=9 then no:=74 ;
KeyPreview я в трушку поставил. С миди сделал всё, т.е вопросов про него нет, но когда я нажимаю клавишу 1 всё звучит хорошо, и после нажимаю клавишу тильду допустим, которую я НЕ ОПИСАЛ, повторяется звук последней клавиши. Что это за ошибка?
Я понял так, что если мы не описали клавишу, автоматом no:=0, а после когда нажал описанную клаву, неописанная просто обезьяничает эту нотку.
Подозреваю дело в отправке миди по нажатии на клаву:
Код:
...
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
 midimsg := $90 + ((no) * $100) + (127 * $10000) + 0;
 midiOutShortMsg (midi, midimsg); // этот код я не понял особенно с $90 и $10000
То ли дело ещё в том, что мы превью ставим при создании формы, т.е автоматически делаем доступными ВСЕ клавиши. А как забацать только для нужных?
-----
И ещё как мне сделать так ,чтобы играли клавиши Z X C V B и т.д вместо противных 1 2 3 4...
Я описывал коды клавиш в процедуре FormKeyPress
и в десятичном, и в символьном ... хотелось бы чтобы показали как грамотно всё делать.)
Тема очень интересная, и думаю, что каждый может хоть что-нибудь предложить, посоветовать.) Я только учусь, стараюсь как могу.)
Заранее спасибо, буду благодарен за ценную информацию.)
Dancewithevil вне форума Ответить с цитированием
Старый 17.05.2010, 23:18   #2
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

В общем ориентируйтесь на переменную var Key: Word;.
Код:
Procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
При нажатии на клавишу в этой переменной находится код нажатой клавиши и потом сравнивайте его с нужным Вам кодом.
Цитата:
И ещё как мне сделать так ,чтобы играли клавиши Z X C V B и т.д вместо противных 1 2 3 4...
Аналогично как я писал выше. К примеру:
Код:
Procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
Begin
If Key = 90 Then
//...
End;
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 18.05.2010, 00:05   #3
856100
Форумчанин
 
Регистрация: 12.08.2008
Сообщений: 135
По умолчанию

Цитата:
Я понял так, что если мы не описали клавишу, автоматом no:=0
А на основании чего вы так поняли?
в начале процедуры FormKeyPress обнулите N.
Будь проще, бери пример с одноклеточных
856100 вне форума Ответить с цитированием
Старый 18.05.2010, 00:44   #4
Dancewithevil
Пользователь
 
Регистрация: 14.03.2010
Сообщений: 18
По умолчанию

Спасибо за информацию, вот покопавшись в интернетном мусоре нашёл это:
Код:
Клавиатура копма используется как клавиатура пианино, реализуется это так:

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key = 69) and not (KeyQAlreadyPressed) then
begin 
form2.SpeedButton4.Down:=true;
KeyQAlreadyPressed := True;
midimsg:=$7f3090;
midioutshortmsg(hmidi_out,midimsg);
end;
end;


procedure TForm2.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key = ord(69)) then
begin
form2.SpeedButton4.Down:=false;
KeyQAlreadyPressed := False;
midimsg:=$7f3080;
midioutshortmsg(hmidi_out,midimsg);
end;
end;
Впринципе ход мне ясен, но почему-то код не работает, клавиша не реагирует никак.. Превью стоит, KeyQAlreadyPressed в глобальной описал, как булеановскую, возможно где-то я ошибся.
И ещё какой из этих способов наиболее оптимальный?
Цитата:
Я понял так, что если мы не описали клавишу, автоматом no:=0
ну я понял это, когда запустил программу и попробывал нажать клавишу неописанную, звук был такой хрипущий, что я и подумал, что это 0. Возможно ошибаюсь.)

Последний раз редактировалось Dancewithevil; 18.05.2010 в 00:48.
Dancewithevil вне форума Ответить с цитированием
Старый 18.05.2010, 00:56   #5
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

На мой взгляд, чтобы Вам не путаться напишите отдельную функцию или процедуру воспроизведения файлов и потом вызывайте её из обработчиков событий
Код:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
//
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
Проверку можете делать через Case.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 18.05.2010, 01:02   #6
Dancewithevil
Пользователь
 
Регистрация: 14.03.2010
Сообщений: 18
По умолчанию

А вы часом не знаете что это за штука такая?) $7f3080 и $7f3090?

У меня ещё проблемы... Мне надо зажать две клавиши и более одновременно, больше всего в этом деле понравилась SpeedButton, описываю путём KeyDown и KeyUp, компилирую, запускаю нажимаю, всё работает. Когда я в другой запускаю, нажимаю две ... А она сначала зажмётся одна, потом вторая с отстованием... Как бы этого можно было избежать?

Последний раз редактировалось Stilet; 18.05.2010 в 07:53.
Dancewithevil вне форума Ответить с цитированием
Старый 18.05.2010, 01:28   #7
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
А вы часом не знаете что это за штука такая?) $7f3080 и $7f3090?
Это обычные числа записанные в 16-теричной системе счисления.
Цитата:
Мне надо зажать две клавиши и более одновременно
Используйте функции через которые можете точно узнать какие клавиши нажаты (GetKeyboardState,GetAsyncKeyState, GetKeyState). Для нажатия кнопок используйте SpeedButton.
Всегда рад помочь!

Последний раз редактировалось Terran; 18.05.2010 в 01:54.
Terran вне форума Ответить с цитированием
Старый 18.05.2010, 07:39   #8
Dancewithevil
Пользователь
 
Регистрация: 14.03.2010
Сообщений: 18
По умолчанию

Уважаемый Terran а вы согли бы привести пример, а то не догнал.)

Последний раз редактировалось Dancewithevil; 18.05.2010 в 07:49.
Dancewithevil вне форума Ответить с цитированием
Старый 18.05.2010, 07:57   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
покопавшись в интернетном мусоре нашёл это:
Глуповатый ты код нашел.
Цитата:
и после нажимаю клавишу тильду допустим, которую я НЕ ОПИСАЛ, повторяется звук последней клавиши. Что это за ошибка?
Все очень просто. Ты проверяешь в FormKeyPress нажатие клавиши но вдобавок у тебя описано еще и FormKeyDown где проверки нет.
Она будет срабатывать всегда судя по коду.
Рекомендую переместить все проверки в FormKeyDown а про FormKeyPress забыть.
Цитата:
как мне сделать так ,чтобы играли клавиши Z X C V B
в OnKeyDown
Код:
if key=ord('Z') then ...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.05.2010, 09:50   #10
Dancewithevil
Пользователь
 
Регистрация: 14.03.2010
Сообщений: 18
По умолчанию

Вроде бы в основном разобрался, но с двумя клавишами так не получилосЬ?
и поподробней объяснить с (GetKeyboardState,GetAsyncKeyState, GetKeyState). Как их правильно описывай, какой формат и т.д
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: какую перененную;
Shift: TShiftState);
Dancewithevil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с горячими клавишами Marsik Общие вопросы Delphi 10 26.02.2010 17:21
перемещение компанента клавишами include Общие вопросы Delphi 11 13.08.2009 12:43
Проблема с горячими клавишами InsaniaF Microsoft Office Word 4 21.05.2009 11:37
Движение обьекта клавишами в с++ Grizzzli Помощь студентам 2 05.04.2009 12:43
Перемещение кнопки клавишами Wolfic Помощь студентам 15 16.10.2007 17:41