2.4. Практикум: Практикум: Создаем мелодию
В рамках этого практического задания вы научитесь создавать программу для проигрывания компьютерных мелодий, состоящих из рандомно выбранных нот.
Вы научитесь
- Использовать цикл с оператором for для отслеживания количества введенных нот в мелодии
- Использовать генератор чисел для воспроизведения случайных музыкальных нот
Во всех предыдущих уроках вы использовали цикл с оператором for для работы со светом, цветом и звуком. В рамках этого практического занятия вы создадите программу, которая позволит воспроизводить мелодии с помощью компьютера. Здесь возможны три варианта написания кода: а) воспроизведение случайных тонов (частот); б) воспроизведение случайных нот при введении их частоты или в) воспроизведение случайных нот по их названию (здесь понадобится составление списка). Также для каждой ноты (тона) вы будете применять длительность (размер). И вишенкой на торте будет программирование цветового LED индикатора таким образом, чтобы он загорался разными цветами в зависимости от проигрываемой ноты.
Примечание для учителя: Если дети выполняют этот проект в классе, будьте готовы, что учащиеся будут использовать разные способы написания программы. В результате, так или иначе, у них должно получиться воспроизведение рандомных частот и тонов. Вы должны объяснить учащимся, что ноты имеют свою частоту и название. В примечании для учителя в конце практического задания вы найдете фрагменты кода разных вариантов воспроизведения нот.
1. Сначала создайте новый проект Python Hub.
Для работы вам понадобится функция, способная производить рандомные числа. Этот инструмент является частью стандартных команд на языке программирования Python, но он находится в отдельном модуле, которого нет в шаблоне проекта по работе с микроконтроллером.
Поэтому откройте меню menu > Random и вставьте в программу следующее выражение:
from random import *
Оно добавляется к группе выражений импорта вверху вашего кода.
2. Затем вы будете использовать кнопку esc, чтобы при необходимости завершить программу.
Из меню menu > TI Hub > Commands выберите выражение
while get_key() != "esc":
Не забудьте структурировать остальные выражения.
Эта функция позволит завершить программу после ее запуска по нажатию на кнопку esc.
3. Следующая функция, которая вам понадобится, это randint(), ее можно найти в меню menu > Random:
r = randint(min, max)
Переменная r сохраняет рандомное целое число для дальнейшего использования. Элементы min и max нужно будет заменить цифрами. Но перед тем как вводить числа, ознакомьтесь с информацией в 4 шаге.
4. Переменная r представляет собой частоту звука. Наше ухо способно различать не все частоты. Очень низких и очень высоких частот следует избегать в работе с программой, потому что они находятся за пределами восприятия человеческого слуха.
Помните, когда вы воспроизводили мелодии в предыдущих уроках, их частота измерялась в сотнях? Поэтому при замене элементов min и max на числа не забудьте про это.
Добавьте рандомную переменную t (для времени) и используйте генератор рандомных чисел uniform(), который можно найти в меню: menu > Random > uniform(min, max). Эта функция выдает рандомное десятичное число между элементами min и max, поэтому некоторые ноты будут проиграны за долю секунды. Выбор чисел для элементов min и max будет зависеть от того, насколько долго вы хотите воспроизводить каждую ноту.
Примечание для учителя: Переменная r тоже может быть стандартной.
5. Далее вы будете работать со звуковым сигналом, используя функцию sound.tone() и замените подсказки frequency (частота) и time (время) своими переменными r и t соответственно.
Не забудьте добавить функцию sleep(), чтобы тоны обрабатывались (звучали) дольше. На какое время должен приостановиться компьютер, решать вам.
6. Что касается части кода для цветового LED индикатора? Напоминаем, что он поддерживает три канала цвета - красный, зеленый и синий, и их значения ограничены диапазоном от 0 до 255. Можно сделать так, чтобы LED индикатор загорался случайным цветом. Для этого используется функция randint(0,255) для каждого канала.
red = randint(0,255)
Или вы можете сделать так, чтобы цвет индикатора напрямую зависел от частоты (r) или длительности (t) ноты, а, может быть, и от обеих характеристик. Будьте осторожны и не выходите за пределы диапазона, то есть не вводите значение больше 255.
На рисунке ниже показан фрагмент кода написания этой программы!
Примечание для учителя: Возможный вариант написания программы:
Использование знака % (модуль) гарантирует, что значение будет в пределах диапазона от 0 до 255 для каждого канала цвета.
Задание посложнее: Что насчет воспроизведения рандомных "нот" для мелодии?
a. Использование частоты:
- N=randint(0,59)
- Freq=55*2**(N/12)
- sound.tone(Freq,time)
b. Использование названий нот:
- Создайте список названий нот: NoteList=["c1","d1","e1"...]
- R=randint(0,len(NoteList)-1)
- sound.note(notelist[R], time)