Espruino:Примеры/Создание звуков и музыки: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
Строка 24: Строка 24:
Сначала давайте зададим контакт, к которому подключен динамик. Я на своей '''F3''' решил воспользоваться контактом '''A9''':
Сначала давайте зададим контакт, к которому подключен динамик. Я на своей '''F3''' решил воспользоваться контактом '''A9''':


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var BUZZER=A9;
var BUZZER=A9;
</syntaxhighlight>
</syntaxhighlight>
Строка 30: Строка 30:
Теперь мы можем сгенерировать на этом контакте [[ШИМ]] и посмотреть, что произойдёт:
Теперь мы можем сгенерировать на этом контакте [[ШИМ]] и посмотреть, что произойдёт:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
analogWrite(BUZZER, 0.5);
analogWrite(BUZZER, 0.5);
</syntaxhighlight>
</syntaxhighlight>
Строка 36: Строка 36:
Это должно издать звук, но для управления частотой нам надо задать дополнительный аргумент:
Это должно издать звук, но для управления частотой нам надо задать дополнительный аргумент:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
analogWrite(BUZZER, 0.5, { freq: 1000 } );
analogWrite(BUZZER, 0.5, { freq: 1000 } );
</syntaxhighlight>
</syntaxhighlight>
Строка 42: Строка 42:
Это издаст писк с частотой [[1 КГц]]. Чтобы выключить этот писк, в аргументе надо задать ''«0»'':
Это издаст писк с частотой [[1 КГц]]. Чтобы выключить этот писк, в аргументе надо задать ''«0»'':


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
digitalWrite(BUZZER,0);
digitalWrite(BUZZER,0);
</syntaxhighlight>
</syntaxhighlight>
Строка 48: Строка 48:
Теперь давайте создадим функцию, которая будет проигрывать любую необходимую нам частоту. Если мы зададим ей ''«0»'', она остановит писк:
Теперь давайте создадим функцию, которая будет проигрывать любую необходимую нам частоту. Если мы зададим ей ''«0»'', она остановит писк:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
function freq(f) {  
function freq(f) {  
   if (f===0) digitalWrite(BUZZER,0);
   if (f===0) digitalWrite(BUZZER,0);
Строка 57: Строка 57:
Давайте протестируем эту функцию:
Давайте протестируем эту функцию:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
freq(1000);
freq(1000);
freq(1500);
freq(1500);
Строка 69: Строка 69:
На втором сайте буквы ''«a-g»'' используются для обозначения низких тонов, а ''«A-G»'' – для высоких тонов. Давайте создадим функцию, которая будет обрабатывать строку символов (по одному за раз) и проигрывать мелодию, заданную с их помощью.
На втором сайте буквы ''«a-g»'' используются для обозначения низких тонов, а ''«A-G»'' – для высоких тонов. Давайте создадим функцию, которая будет обрабатывать строку символов (по одному за раз) и проигрывать мелодию, заданную с их помощью.


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var pitches = {
var pitches = {
   'a':220.00,
   'a':220.00,
Строка 97: Строка 97:
Теперь давайте зададим мелодию при помощи переменной '''tune''', а также создадим переменную '''pos''', которая будет обозначать позицию в мелодии.
Теперь давайте зададим мелодию при помощи переменной '''tune''', а также создадим переменную '''pos''', которая будет обозначать позицию в мелодии.


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var tune = "c    c    c  d    e  e  d  e    f  g  C  C C  g  g g  e  e e  c  c c  g    f  e  d c";
var tune = "c    c    c  d    e  e  d  e    f  g  C  C C  g  g g  e  e e  c  c c  g    f  e  d c";
var pos = 0;
var pos = 0;
Строка 104: Строка 104:
Теперь давайте воспроизведём эту мелодию:
Теперь давайте воспроизведём эту мелодию:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
setInterval(step, 100);
setInterval(step, 100);
</syntaxhighlight>
</syntaxhighlight>
Строка 110: Строка 110:
Чтобы перезапустить мелодию, просто напишите:
Чтобы перезапустить мелодию, просто напишите:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
pos=0;
pos=0;
</syntaxhighlight>
</syntaxhighlight>
Строка 116: Строка 116:
Вы также можете загрузить другую мелодию:
Вы также можете загрузить другую мелодию:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var tune = "g  e    g    g  e    g  A  A  g f  e  d  e  f";
var tune = "g  e    g    g  e    g  A  A  g f  e  d  e  f";
pos=0;
pos=0;
Строка 123: Строка 123:
А если вы хотите перезапускать мелодию при нажатии на кнопку, просто напечатайте:
А если вы хотите перезапускать мелодию при нажатии на кнопку, просто напечатайте:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
setWatch("pos=0", BTN, true);
setWatch("pos=0", BTN, true);
</syntaxhighlight>
</syntaxhighlight>

Текущая версия от 06:53, 24 мая 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Создание звуков и музыки[1]

Espruino - Making Music with Microcontrollers

Espruino недостаточно мощна для того, чтобы проигрывать музыкальные файлы формата MP3 или WAV, но в то же время способна генерировать писки на разных частотах при помощи ШИМ. В этом руководстве мы научимся генерировать звуки при помощи динамика от старого ПК.

Нам понадобятся

Подсоединение

Подключите два провода динамика к плате Espruino: один к контакту GND, а второй – к сигнальному контакту, умеющему генерировать ШИМ. Чтобы узнать список контактов, которые умеют так делать, напечатайте analogWrite().

Примечание: Сразу скажем, что вся эта затея может обернуться для вашей Espruino довольно плачевно. Идеально было бы добавить в цепь транзистор, чтобы усилить сигнал, или хотя бы последовательно подключить резистор, чтобы ограничить силу тока. Но платы Espruino не особо дорогие, так что можете попробовать сделать проект и безо всех этих «добавок».

Код

Сначала давайте зададим контакт, к которому подключен динамик. Я на своей F3 решил воспользоваться контактом A9:

var BUZZER=A9;

Теперь мы можем сгенерировать на этом контакте ШИМ и посмотреть, что произойдёт:

analogWrite(BUZZER, 0.5);

Это должно издать звук, но для управления частотой нам надо задать дополнительный аргумент:

analogWrite(BUZZER, 0.5, { freq: 1000 } );

Это издаст писк с частотой 1 КГц. Чтобы выключить этот писк, в аргументе надо задать «0»:

digitalWrite(BUZZER,0);

Теперь давайте создадим функцию, которая будет проигрывать любую необходимую нам частоту. Если мы зададим ей «0», она остановит писк:

function freq(f) { 
  if (f===0) digitalWrite(BUZZER,0);
  else analogWrite(BUZZER, 0.5, { freq: f } );
}

Давайте протестируем эту функцию:

freq(1000);
freq(1500);
freq(0);

А теперь давайте сыграем какую-нибудь музыку. Нам понадобятся вот эти два сайта:

  • Частоты музыкальных нот
  • Детские песенки, где ноты обозначены буквами

На втором сайте буквы «a-g» используются для обозначения низких тонов, а «A-G» – для высоких тонов. Давайте создадим функцию, которая будет обрабатывать строку символов (по одному за раз) и проигрывать мелодию, заданную с их помощью.

var pitches = {
  'a':220.00,
  'b':246.94,
  'c':261.63,
  'd':293.66,
  'e':329.63,
  'f':349.23,
  'g':392.00,
  'A':440.00,
  'B':493.88,
  'C':523.25,
  'D':587.33,
  'E':659.26,
  'F':698.46,
  'G':783.99
};

function step() {
  var ch = tune[pos];
  if (ch !== undefined) pos++;
  if (ch in pitches) freq(pitches[ch]);
  else freq(0); // выключаем
}

Теперь давайте зададим мелодию при помощи переменной tune, а также создадим переменную pos, которая будет обозначать позицию в мелодии.

var tune = "c    c    c   d    e   e  d   e    f   g   C  C C   g  g g   e  e e   c  c c  g    f  e   d c";
var pos = 0;

Теперь давайте воспроизведём эту мелодию:

setInterval(step, 100);

Чтобы перезапустить мелодию, просто напишите:

pos=0;

Вы также можете загрузить другую мелодию:

var tune = "g  e    g    g   e    g   A  A  g f  e  d   e   f";
pos=0;

А если вы хотите перезапускать мелодию при нажатии на кнопку, просто напечатайте:

setWatch("pos=0", BTN, true);

См.также

Внешние ссылки