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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2008, 00:27   #1
треч
 
Регистрация: 31.01.2008
Сообщений: 7
Лампочка Ноты и интервалы между ними

Вобщем дела такие, нужно определить интервал между нотами.
type
нота=(до, ре,ми,фа,соль,ля,си);
интервал=(секунда, терция, кварта, квинта, секста, септима);
n1 и n2 - это переменные для нот, тоесть n1 первая строка, а вторая строка естественно n2.
i - это интервал.
Если ДО и РЕ или РЕ и МИ, то это секунда, если ДО и МИ или МИ и СОЛЬ, то это терция, и так дальше в том же духе .
В принципе я решил, да вот только мой способ отличается объемом и тем, что можно было все записать более проще, но так и не могу догнать, как записать еще проще. Вот мой код, если можете, пожалуйсто помогите упростить его и использовать плюс к этому переменную i, которую я не использовал . Меня преподша убьет, когда увидит мой код . Кстати я хотел сделать для каждого интервала отдельную процедуру, вродь все сделал и вызывал в кнопке, но не работало. Пришлось все запихнуть в одну кнопку .

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
n1,n2:integer;
begin
//ноты для первой строки
if Edit1.Text='до' then n1:=1 else
if edit1.Text='ре' then n1:=2 else
if edit1.Text='ми' then n1:=3 else
if edit1.Text='фа' then n1:=4 else
if edit1.Text='соль' then n1:=5 else
if edit1.Text='ля' then n1:=6 else
if edit1.Text='си' then n1:=7 ;
//ноты для второй строки
if edit2.Text='до' then n2:=1 else
if edit2.Text='ре' then n2:=2 else
if edit2.Text='ми' then n2:=3 else
if edit2.Text='фа' then n2:=4 else
if edit2.Text='соль' then n2:=5 else
if edit2.Text='ля' then n2:=6 else
if edit2.Text='си' then n2:=7 ;
//ошибка
if n1=n2 then
begin
showmessage('одинаковые ноты запрещается вводить');
exit;
end;
//секунда
if (n1=1) and (n2=2) then label1.caption:='секунда' else
if (n1=2) and (n2=3) then label1.caption:='секунда' else
if (n1=3) and (n2=4) then label1.caption:='секунда' else
if (n1=4) and (n2=5) then label1.caption:='секунда' else
if (n1=5) and (n2=6) then label1.caption:='секунда' else
if (n1=7) and (n2=1) then label1.caption:='секунда' ;
//терция
if (n1=1) and (n2=3) then label1.caption:='терция' else
if (n1=3) and (n2=5) then label1.caption:='терция' else
if (n1=5) and (n2=7) then label1.caption:='терция' else
if (n1=7) and (n2=2) then label1.caption:='терция' else
if (n1=2) and (n2=4) then label1.caption:='терция' else
if (n1=4) and (n2=6) then label1.caption:='терция' else
if (n1=6) and (n2=1) then label1.caption:='терция' ;
//кварта
if (n1=1) and (n2=4) then label1.caption:='кварта' else
if (n1=4) and (n2=7) then label1.caption:='кварта' else
if (n1=7) and (n2=3) then label1.caption:='кварта' else
if (n1=3) and (n2=6) then label1.caption:='кварта' else
if (n1=6) and (n2=2) then label1.caption:='кварта' else
if (n1=2) and (n2=5) then label1.caption:='кварта' else
if (n1=5) and (n2=1) then label1.caption:='кварта' ;
//квинта
if (n1=1) and (n2=5) then label1.caption:='квинта' else
if (n1=5) and (n2=2) then label1.caption:='квинта' else
if (n1=2) and (n2=6) then label1.caption:='квинта' else
if (n1=6) and (n2=3) then label1.caption:='квинта' else
if (n1=3) and (n2=7) then label1.caption:='квинта' else
if (n1=7) and (n2=4) then label1.caption:='квинта' else
if (n1=4) and (n2=1) then label1.caption:='квинта' ;
//секста
if (n1=1) and (n2=6) then label1.caption:='секста' else
if (n1=6) and (n2=4) then label1.caption:='секста' else
if (n1=4) and (n2=2) then label1.caption:='секста' else
if (n1=2) and (n2=7) then label1.caption:='секста' else
if (n1=7) and (n2=5) then label1.caption:='секста' else
if (n1=5) and (n2=3) then label1.caption:='секста' else
if (n1=3) and (n2=1) then label1.caption:='секста' ;
//септима
if (n1=1) and (n2=7) then label1.caption:='септима' else
if (n1=7) and (n2=6) then label1.caption:='септима' else
if (n1=6) and (n2=5) then label1.caption:='септима' else
if (n1=5) and (n2=4) then label1.caption:='септима' else
if (n1=4) and (n2=3) then label1.caption:='септима' else
if (n1=3) and (n2=2) then label1.caption:='септима' else
if (n1=2) and (n2=1) then label1.caption:='септима' ;
end;
Кстати перед написанием этой проги я нарисовал 6 картинок, которые кстати помогли мне лучше понять. Если интересно, нарисуйте 7 точек образующие круг, после чего каждую пронумеровать и подписать соответствующими нотами, должны ноты и нумерация в 6-ти рисунках индентичны. после чего провести стрелки, определяясь по интервалам в условии. Начинается стрелка и кончается там, где должна по указанному интервалу, и продолжать дальше оттуда где кончилась в том же духе, до главной ноты, точнее ДО, от которой пошла первая стрелка. Для каждого из 6-ти рисунков соответствует нужный интервал.
Помогите записать этот код в сокращенном и более легком способе, можно использовать мой метод рисунков, а можете свой придумать, главное чтобы все работало и правильно. Заранее спасибо.
треч вне форума Ответить с цитированием
Старый 01.02.2008, 00:46   #2
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Достаточно знать, что интервал определяется количеством тонов между нотами.

Намёк понял?
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 01.02.2008, 01:09   #3
треч
 
Регистрация: 31.01.2008
Сообщений: 7
По умолчанию

Если честно, я не понял. В музыкальной школе не обучался. В принципе это мой второй код, но есть первый, он намного короче, но все равно не соответствует условию, точнее сказать более запутанный и менее объемный, а также там все равно не используется переменная i. ))
Вот пример первого кода для интервалов, он работает также правильно как и второй.

Код:
if (n1=n2-1) or (n1=n2+6) then label1.caption:='секунда' else
if (n1=n2-2) or (n1=n2+5) then label1.caption:='терция' else
if (n1=n2-3) or (n1=n2+4) then label1.caption:='кварта' else
if (n1=n2-4) or (n1=n2-4) then label1.caption:='квинта' else
if (n1=n2-5) or (n1=n2-5) then label1.caption:='секста' else
if (n1=n2+1) or (n1=n2-6) then label1.caption:='септима' ;
Подскажите как написать такую же программу, с использованием трех переменных n1?n2 для нот, и i для интервалов. Мне почему-то кажется что здесь нужно использовать цикл, но так как я начинающий, то не могу догнать, как это записать. Помогите мне кодом, а не намеками )))
треч вне форума Ответить с цитированием
Старый 01.02.2008, 01:52   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Честно говоря, мне кажется, что всю гору if'ов можно заменить вот такой конструкцией:
Код:
case abs((N1 - N2) mod 7) of
    1: label1.caption:='секунда';
    2: label1.caption:='терция';
    3: label1.caption:='кварта';
    4: label1.caption:='квинта';
    5: label1.caption:='секста';
    6: label1.caption:='септима';
end;
Правда, это стоит проверить , у меня паскаля под рукой нет.
B_N вне форума Ответить с цитированием
Старый 01.02.2008, 02:28   #5
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Код:
var
  Form1: TForm1;
  DRM : array [1..13] of string;
  i : Byte;
  Ton : real;
implementation

{$R *.dfm}

Procedure Ton_(nota: string);
Var x : real;
Begin
x := 0;
For i := 1 to 13 do
Begin
   if DRM[i] = nota Then
     Begin
      Ton := x;
      Break;
     End;
    x := x + 0.5;
End;
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
DRM[1] := 'До'; DRM[2] := 'До диез'; DRM[3] := 'Ре';
DRM[4] := 'Ре диез'; DRM[5] := 'Ми'; DRM[6] := 'Фа';
DRM[7] := 'Фа диез'; DRM[8] := 'Соль'; DRM[9] := 'Соль диез';
DRM[10] := 'Ля'; DRM[11] := 'Ля диез'; DRM[12] := 'Си';
DRM[13] := 'До второй октавы';
end;

procedure TForm1.Button1Click(Sender: TObject);
var interval : real;
     S : string;
begin
Interval := 0;
Ton_(Edit1.text);
interval := Ton;
Ton_(Edit2.Text);
interval := interval - Ton;
if interval < 0 then Interval := interval * -1;
if interval = 0 Then Label1.Caption := 'самый ненужный интервал с расстоянием 0 полутонов!';
if interval = 0.5 Then Label1.Caption := 'малая секунда';
if interval = 1 Then Label1.Caption := 'большая секунда';
if interval = 1.5 Then Label1.Caption := 'малая терция';
if interval = 2 Then Label1.Caption := 'большая терция';
if interval = 2.5 Then Label1.Caption := 'кварта';
if interval = 3 Then Label1.Caption := 'тритон';
if interval = 3.5 Then Label1.Caption := 'квинта';
if interval = 4 Then Label1.Caption := 'малая секста';
if interval = 4.5 Then Label1.Caption := 'большая секста';
if interval = 5 Then Label1.Caption := 'малая септима';
if interval = 5.5 Then Label1.Caption := 'большая септима';
if interval = 6 Then Label1.Caption := 'октава';
end;

end.
Или мне показалось или по геморойности это должно выглядить так....
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 01.02.2008, 02:39   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Действительно "геморрой" устроили...
Ставим 2 радиогруппы с нотами и вычисляем разность между итеминдексами групп...
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интервалы времени znickolai84 Компоненты Delphi 4 16.05.2008 15:53
Чат по LAN между 2 компами aesoem Работа с сетью в Delphi 5 11.04.2008 14:23
Вопрос по 2 апи между ними база danswin БД в Delphi 1 27.12.2007 20:26
Как в Microsoft Visual Basic 6.0 открыть Exel файл, считать с него данные(числа) и дальше работать с ними Dimon88 Microsoft Office Excel 7 20.10.2007 13:30
Где найти коды, подключение, синхронизацию Motorola p2k с ПК и как с ними работать? Captain Nemo Свободное общение 0 02.10.2007 11:10