Что нового

Beep() - Набор функций по написанию мелодий для проектов

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
Всем привет и хорошего настроения!

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

Можем поиграть в "Угадай мелодию" на примере вложенных в скрипт =) Или можете попробовать написать свои.

Оставлю себе на заметку на будущее:

- можно развить идею с помощью функции, на вход которой поступает текстовая строка с указанием нот и длительности.
- проверить, можно ли разделить воспроизведение звуков на два и более потока - позволит проигрывать полифонию.
- проверить, можно ли записывать несколько строк в одну через какой-нибудь разделитель. В VBA работает двоеточие, тут может быть что-то другое.
- можно сделать полноценный музыкальный редактор, который будет генерировать код Au3 для вставки в проекты. (Предварительно лень, будет нужна мотивация).

Код:
Global $Dur	;Средняя длительность для ноты. Желательно не менее 200.

;Набор функций для написания собственных мелодий с помощью встроенной функции Beep()
;Версия 1.00 от 24 марта 2015. Автор: Роман Rioran Воронов
;
;Функции позволяют писать мелодии (в соответствии с примерами ниже)
;в удобном для музыкантов формате: Нота(Октава, [Не обязательный] Время)
;
;s - означает sharp (он же диез), Время - множитель для переменной $Dur
;Этот множитель может быть дробным. Желательно, чтобы $Dur в результате
;не стал менее 200 мс, т.к. ввиду разницы в работе процессоров
;может вызвать сбои в воспроизведении Ваших мелодий
;
;Октава - номер соответствует общепринятому номеру октавы,
;а ноль - соответствует малой октаве.
;
;Функция P( Время ) от слова Pause - задает период тишины

Notes_Initiation() ;Объявление используемых далее констант
Play_Melody_04()   ;Проигрывание мелодии-примера

Func Play_Melody_00() ;Пустой шаблон для мелодий

   $Dur = 200

EndFunc

Func Play_Melody_01() ;Некоторая народная мелодия, угадаете? =)

   $Dur = 200

   h(2,2)
   a(2,2)
   fs(2)
   g(2)
   a(2,2)
   fs(2)
   g(2)
   a(2,2)
   g(2)
   fs(2)
   e(2,2)

   h(2,1)
   h(2,1)
   a(2,1.5)
   g(2,0.5)
   fs(2)
   g(2)
   a(2,2)
   fs(2)
   g(2)
   a(2,2)
   g(2)
   fs(2)
   e(2,2)

EndFunc

Func Play_Melody_02() ;Перебор, просто для теста

   $Dur = 200

   e(0)
   g(1)
   h(1)
   g(1)
   e(2)
   g(1)
   h(1)
   g(1)

   a(0)
   a(1)
   c(2)
   a(1)
   e(2)
   a(1)
   c(2)
   a(1)

   d(1)
   a(1)
   d(2)
   a(1)
   fs(2)
   a(1)
   d(2)
   a(1)

   g(0)
   g(1)
   h(1)
   g(1)
   g(2,4)

EndFunc

Func Play_Melody_03() ;Знаменитая зарубежная, ректро-рок

   $Dur = 200

   e(1)
   e(0)
   g(1)
   e(0)
   a(1)
   e(0)
   e(0)
   e(0)

   e(1)
   e(0)
   g(1)
   as(1)
   a(1)
   e(0)
   e(0)
   e(0)

   e(1)
   e(0)
   g(1)
   e(0)
   a(1)
   a(0)
   a(0)
   a(0)

   g(1)
   a(0)
   e(1,2)
   p(4)

EndFunc

Func Play_Melody_04() ;Немного ретро-панка

   $Dur = 200

   a(0)
   a(0)
   c(1)
   c(1)
   d(1)
   d(1)
   e(1)
   e(1)

   a(0)
   a(0)
   c(1)
   c(1)
   d(1)
   d(1)
   e(1)
   e(1)

   a(0)
   a(0)
   c(1)
   c(1)
   g(1)
   g(1)
   f(1)
   f(1)

   a(0)
   a(0)
   c(1)
   c(1)
   g(1)
   g(1)
   f(1)
   f(1)

   g(1)
   g(1)
   f(1)
   f(1)
   e(1)
   e(1)
   d(1)
   d(1)

   g(1)
   g(1)
   f(1)
   f(1)
   e(1)
   e(1)
   d(1)
   d(1)

   g(0)
   g(0)
   h(0)
   h(0)
   c(1)
   c(1)
   d(1)
   d(1)

   g(0)
   g(0)
   h(0)
   h(0)
   c(1)
   c(1)
   d(1)
   d(1)

EndFunc

Func Notes_Initiation() ;Объявление нотных констант
   Global Const $C[5]  = [130.82, 261.63, 523.25, 1046.5, 2093]
   Global Const $Cs[5] = [138.59, 277.18, 554.36, 1108.7, 2217.4]
   Global Const $D[5]  = [147.83, 293.66, 587.32, 1174.6, 2349.2]
   Global Const $Ds[5] = [155.56, 311.13, 622.26, 1244.5, 2489]
   Global Const $E[5]  = [164.81, 329.63, 659.26, 1318.5, 2637]
   Global Const $F[5]  = [174.62, 349.23, 698.46, 1396.9, 2793.8]
   Global Const $Fs[5] = [185.00, 369.99, 739.98, 1480.0, 2960]
   Global Const $G[5]  = [196.00, 392.00, 784.00, 1568.0, 3136]
   Global Const $Gs[5] = [207.00, 415.30, 830.60, 1661.2, 3332.4]
   Global Const $A[5]  = [220.00, 440.00, 880.00, 1720.0, 3440]
   Global Const $As[5] = [233.08, 466.16, 932.32, 1864.6, 3727.2]
   Global Const $H[5]  = [246.96, 493.88, 987.75, 1975.5, 3951]
EndFunc

;Блок функций, задающих конкретные ноты.
Func C($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($C[$Octave], $dur * $NoteTime)
EndFunc
Func Cs($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($Cs[$Octave], $dur * $NoteTime)
EndFunc
Func D($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($D[$Octave], $dur * $NoteTime)
EndFunc
Func Ds($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($Ds[$Octave], $dur * $NoteTime)
EndFunc
Func E($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($E[$Octave], $dur * $NoteTime)
EndFunc
Func F($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($F[$Octave], $dur * $NoteTime)
EndFunc
Func Fs($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($Fs[$Octave], $dur * $NoteTime)
EndFunc
Func G($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($G[$Octave], $dur * $NoteTime)
EndFunc
Func Gs($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($Gs[$Octave], $dur * $NoteTime)
EndFunc
Func A($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($A[$Octave], $dur * $NoteTime)
EndFunc
Func As($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($As[$Octave], $dur * $NoteTime)
EndFunc
Func H($Octave, $NoteTime = 1)
   $Octave += 1
   Beep($H[$Octave], $dur * $NoteTime)
EndFunc
Func P($NoteTime = 1)
   Sleep($dur)
EndFunc
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Нормально получилось.
Я ещё вот на подобии видел: это и это.
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
Спасибо, alex33, приятно =)

Ссылки интересные. Если сравнивать, то у моих функций есть, пожалуй, только одно основное преимущество - музыкант (не программист) может сразу начать писать мелодии привычными для себя знаками.
 
Верх