Консультация № 175017
08.12.2009, 03:54
35.00 руб.
08.12.2009, 04:52
0 6 2
Доброе время суток, уважаемые эксперты! У меня к Вам вопрос на тему воспроизведения мелодий в Pascal с помощью возможностей модуля Crt, и процедур этого модуля Sound Delay, NoSound. Было предложено воспроизвести любую на выбор мелодию в Паскале. Объектом моих мучений стала мелодия Jingle Bells. Необходимые материалы для решения находятся на рисунке. Мой вариант решения находится ниже (в приложении). Итак, внимание вопрос: Возможно как мне кажется, программа реализована не совсем удачно, вмысле работает правильно, но возможно написана так сказать "не по умному". Поэтому если есть какие нибудь предложения как сделать программу более универсальной, то с удовольствием выслушаю. Я только студент, и еще только учусь, поэтому выслушаю любые замечания и советы. Спасибо за внимание ; )


Приложение:
Uses crt;
const C=2615;{chastoty not}
D=2935;
E=3295;
F=3495;
G=3925;
A=4400;
H=4940;
q=500;{dlya zadergki}
procedure myDelay(t:word);{procedura zadergki vmesto DELAY, chtoby zdelat zadergku bolee dlitelnoy}
var i,k:word;
f:real;
begin
for i:=1 to t do
for k:=1 to 30 do
f:=SQRT(38342);
end;
BEGIN
Sound(E);
mydelay(q*10);
NoSound;
mydelay(q);
Sound(E);
mydelay(q*10);
NoSound;
mydelay(q);
Sound(E);
mydelay(q*20);
NoSound;
mydelay(q);
Sound(E);
mydelay(q*10);
NoSound;
mydelay(q);
Sound(E);
mydelay(q*10);
NoSound;
mydelay(q);
Sound(E);
mydelay(q*20);
NoSound;
mydelay(q);
Sound(E);
mydelay(q*10);
NoSound;
mydelay(q);
Sound(G);
mydelay(q*10);
NoSound;
mydelay(q);
Sound(C);
mydelay(q*10);
NoSound;
mydelay(q);
Sound(D);
mydelay(q*10);
NoSound;
mydelay(q);
Sound(E);
mydelay(q*40);
NoSound;
mydelay(q*2);
{part 2}
Sound(F);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(F);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(F);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(F);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(F);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(E);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(E);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(E);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(G);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(G);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(F);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(D);
mydelay(q*10);
NoSound;
mydelay(q);
NoSound;
Sound(C);
mydelay(q*40);
NoSound;
END.



Обсуждение

Неизвестный
08.12.2009, 03:57
общий
Извините, забыл вставить рисунок:


давно
Мастер-Эксперт
425
4118
08.12.2009, 05:20
общий
Камынин Владислав Дмитриевич:
И у Вас звуки с помощью CRT (sound, nosound) работают? У меня так нет.
Я бы Вам предложил для сокращения размеров программы аналогичную функцию из WinAPI (почему то я нисколько не сомневаюсь, что Ваш компьютер работает под управлением Windows ):
Beep(Частота, Длительность_звучания);
Длительность звучания задаётся в милисекундах, частота - в герцах. Тогда у Вас вместо вот такой конструкции:
Код:
   Sound(E);
mydelay(q*10);
NoSound;

получится такая:
Код:
Beep(E, q*10);

Согласитесь, это выглядит более красиво.
Кроме того, если исходить из предпосылки, что целая нота длится 4 секунды, соответственно можно в качестве длительности подставлять реальные цифры, либо сделать наглядное представление длительности в виде констант, например:
Код:
Const
WholeNote = 4000; //Целая нота
HalfNote = 2000; //Половинная нота
QuarterNote = 1000; //Четвертная нота
...
Begin
...
Beep(E, QuarterNote);
...
End;
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
08.12.2009, 10:07
общий
это ответ
Здравствуйте, Камынин Владислав Дмитриевич.
Я бы поместил частоту нот и мелодию в отдельные массивы. И проигрывал мелодию в цикле из массива. Программный код сокращается в разы и редактировать мелодию стало гораздо легче.
Еще я добавил процедуру myBeep, в которой происходит проигрывание нотки. Её можешь подправить так, как тебе больше нравится. Весь код в приложении:

Приложение:
Uses crt;

const
Mnot:array[1..7] of integer=(2615, 2935, 3295, 3495, 3925, 4400, 4940);{chastoty not}
q=500;{dlya zadergki}
DlMel=24;
Mmelod:array[1..DlMel, 1..2] of integer= {Массив с мелодией. Ноты в виде (Нота, Длительность)}
((3,10), (3,10), (3,20), (3,10), (3,10), (3,20),
(3,10), (5,10), (1,10), (2,10), (3,40),
{part 2}
(4,10), (4,10), (4,10), (4,10), (4,10), (3,10),
(3,10), (3,10), (5,10), (5,10), (4,10), (2,10), (1,40));

procedure myDelay(t:word);{procedura zadergki vmesto DELAY, chtoby zdelat zadergku bolee dlitelnoy}
var i,k:word;
f:real;
begin
for i:=1 to t do
for k:=1 to 30 do
f:=SQRT(38342);
end;

procedure myBeep(Ch, Dl:integer);
{Это процедура проигрывания нотки}
begin
{по Вашему методу}
Sound(Ch);
mydelay(q*Dl);
NoSound;
mydelay(q);
{Или по методу, предложенному в мини-форуме sir Henry}
{Beep(Ch, q*Dl);}
end;

var i:integer;

BEGIN
for i:=1 to DlMel do
myBeep(Mnot[Mmelod[i, 1]], Mmelod[i, 2]);
END.
Неизвестный
08.12.2009, 23:57
общий
Alex1, sir Henry, большое спасибо за оказанную помощь
Неизвестный
09.12.2009, 18:18
общий
Делать задержку с помощью выполнения цикла не самый лучший вариант. Ваша программа на одних компьютерах будет работать мендленне, на других быстрее. Можно синхронизироваться с часам. Например, вызывая функцию GetTime модуля Dos.
Неизвестный
12.12.2009, 22:51
общий
это ответ
Здравствуйте, Камынин Владислав Дмитриевич! Я считаю, что программа слишком длинная, и поэтому советую Вам объединить процедуры Sound в циклы (если найдутся общие фрагменты)
Форма ответа