Программирование LEGO NXT роботов на языке NXC - Создаём музыку — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(Играем музыку)
(Играем музыку)
 
(не показано 5 промежуточных версий этого же участника)
Строка 2: Строка 2:
  
 
=Создаём музыку=
 
=Создаём музыку=
The NXT has a built-in speaker that can play tones and even sound files. This is in particular useful when you
+
Модуль NXT имеет встроенный динамик и может воспроизводить музыку и даже звуковые файлы. Это может быть полезно в том случае, когда вы хотите чтобы NXT сказал вам, что что-то случилось. Но это также может быть просто более интересно, когда робот играет музыку или разговаривает в процессе выполнения заданий.
want to make the NXT tell you that something is happening. But it can also be funny to have the robot make
 
music or talk while it runs around.
 
  
 
==Проигрываем звуковые файлы==
 
==Проигрываем звуковые файлы==
BricxCC has a built-in utility to convert .wav files into .rso files accessible via menu Tools Sound conversion.
+
BricxCC содержит в себе встроенную утилиту для преобразования .wav-файлов в .rso-файлы, доступную через меню "Tools" / "Sound conversion".
Then you can store .rso sound files on NXT flash memory using another utility, the NXT memory browser
+
 
(Tools NXT explorer) and play them with the command
+
Завершив преобразование, вы можете сохранить .rso-файлы со звуками во флеш-память NXT при помощи другой утилиты (меню "Tools" / "NXT explorer"), после чего их можно будет воспроизводить командой
  
 
  PlayFileEx(filename, volume, loop?)
 
  PlayFileEx(filename, volume, loop?)
  
Its arguments are sound filename, volume (a number from 0 to 4), and loop: this last argument is set to 1
+
Аргументы команды - имя файла, громкость (число от 0 до 4), и необязательный флаг зацикливания "loop", выставьте его в 1 (или TRUE), если хотите, чтобы файл вопроизвёлся не один раз, выставление его в 0 (или FALSE) воспроизведёт файл один раз.
(TRUE) if you want the file to be looped or 0 (FALSE) if you want to play it only once.
 
  
 
  #define TIME 200
 
  #define TIME 200
Строка 41: Строка 38:
 
  }
 
  }
  
This nice program first plays the startup tune you might know already; then uses the other standard click sound
+
Эта забавная программа сначала проигрывает звук начала работы, который вы возможно уже слышали, а затем использует стандартный звук "click" чтобы сыграть джингл “Shave and a haircut” который приводит в восторг кролика Роджера! Макрос действительно очень удобен в данном случае для упрощения записи команд в главное задаче: попробуйте модифицировать настройки громкости чтобы сделать мелодию наиболее приятной.
to play “Shave and a haircut” jingle that made Roger Rabbit go crazy! The macros are really useful in this case
 
to simplify notation in the main task: try modifying the volume settings to add accents in the tune.
 
  
 
==Играем музыку==
 
==Играем музыку==
  
To play a tone, you can use the command PlayToneEx(frequency, duration, volume, loop?)
+
Чтобы воспроизвести тоновый сигнал вы можете использовать команду PlayToneEx(frequency, duration, volume, loop?)
It has four arguments. The first is the frequency in Hertz, the second the duration (in 1/1000 of a second, like in
+
Она имеет 4 параметра. Первый это частота тона в Герцах, второй - продолжительность в 1/1000 секунды (как в операторе "wait"), и последний - такой же флаг зацикливания, как и в предыдущей команде. Кроме того может быть использована команда PlayTone(frequency, duration), в этом случае громкость используется настроенная в меню вашего модуля NXT, а функция зацикливания недоступна.
the wait command), and the last are volume a loop as before. PlayTone(frequency, duration) can also be
 
used; in this case the volume is the one set by NXT menu, and loop is disabled.
 
  
Here is a table of useful frequencies:
+
Вот таблица с полезными частотами музыкальных нот по октавам:
{|
+
{| class="standard"
|Sound
+
|Нота
 
|3
 
|3
 
|4
 
|4
Строка 63: Строка 56:
 
|9
 
|9
 
|-
 
|-
|B
+
|B (Си)
 
|247
 
|247
 
|494
 
|494
Строка 71: Строка 64:
 
|7902
 
|7902
 
|-
 
|-
|A#
+
|A# (Ля-диез)
 
|233
 
|233
 
|466
 
|466
Строка 79: Строка 72:
 
|7458
 
|7458
 
|-
 
|-
|A
+
|A (Ля)
 
|220
 
|220
 
|440
 
|440
Строка 88: Строка 81:
 
|14080
 
|14080
 
|-
 
|-
|G#
+
|G# (Соль-диез)
 
|  
 
|  
 
|415
 
|415
Строка 97: Строка 90:
 
|13288
 
|13288
 
|-
 
|-
|G
+
|G (Соль)
 
|  
 
|  
 
|392
 
|392
Строка 106: Строка 99:
 
|12544
 
|12544
 
|-
 
|-
 +
|F# (Фа-диез)
 
|  
 
|  
|F#
 
 
|370
 
|370
 
|740
 
|740
Строка 115: Строка 108:
 
|11840
 
|11840
 
|-
 
|-
|F
+
|F (Фа)
 
|  
 
|  
 
|349
 
|349
Строка 124: Строка 117:
 
|11176
 
|11176
 
|-
 
|-
|E
+
|E (Ми)
 
|  
 
|  
 
|330
 
|330
Строка 133: Строка 126:
 
|10548
 
|10548
 
|-
 
|-
|D#
+
|D# (Ре-диез)
 
|  
 
|  
 
|311
 
|311
Строка 142: Строка 135:
 
|9956
 
|9956
 
|-
 
|-
|D
+
|D (Ре)
 
|  
 
|  
 
|294
 
|294
Строка 151: Строка 144:
 
|9398
 
|9398
 
|-
 
|-
|C#
+
|C# (До-диез)
 
|  
 
|  
 
|277
 
|277
Строка 160: Строка 153:
 
|8870
 
|8870
 
|-
 
|-
|C
+
|C (До)
 
|  
 
|  
 
|262
 
|262
Строка 170: Строка 163:
 
|}
 
|}
  
As with the case of PlayFileEx, the NXT does not wait for the note to finish. So if you use multiple tones in
+
Как и в случае с PlayFileEx, модуль NXT не дожидается когда нота доиграет. Так что если вы хотите воспроизвести подряд несколько нот - вам придётся добавить между ними достаточно долгие команды "wait". Например вот так:
a row then you had better add (slightly longer) wait commands in between. Here is an example:
 
  
 
  #define VOL 3
 
  #define VOL 3
Строка 183: Строка 175:
 
  }
 
  }
  
You can create pieces of music very easily using the Brick Piano that is part of the BricxCC.
+
Вы можете с легкость создавать музыкальные фрагменты с использованием инструмента "Brick Piano", являющегося частью BricxCC.
  
If you want to have the NXT play music while driving around, better use a separate task for it. Here you have an
+
Если вы хотите, чтобы NXT играл музыку, когда выполнял различные задачи - лучше используйте для этого отдельную задачу. Вот пример достаточно достаточно глупой программы, где NXT ездит взад-вперед и параллельно играет музыку.
example of a rather stupid program where the NXT drives back and forth, constantly making music.
 
  
 
  task music()
 
  task music()
Строка 214: Строка 205:
  
 
==Подводим итоги==
 
==Подводим итоги==
In this chapter you learned how to let the NXT play sounds and music. Also you saw how to use a separate task
+
В этой главе вы научились как с помощью NXT проигрывать звуки и музыку. Кроме того вы увидели, как использовать отдельную задачу для воспроизведения музыки.
for music.
 

Текущая версия на 18:21, 18 мая 2009

Автор: Daniele Benedettelli

Перевод: © Ботов Антон aka =DeaD=, 2009

Эксклюзивно для www.roboforum.ru
копирование на другие ресурсы и публикация перевода
без разрешения его автора запрещены

Создаём музыку

Модуль NXT имеет встроенный динамик и может воспроизводить музыку и даже звуковые файлы. Это может быть полезно в том случае, когда вы хотите чтобы NXT сказал вам, что что-то случилось. Но это также может быть просто более интересно, когда робот играет музыку или разговаривает в процессе выполнения заданий.

Проигрываем звуковые файлы

BricxCC содержит в себе встроенную утилиту для преобразования .wav-файлов в .rso-файлы, доступную через меню "Tools" / "Sound conversion".

Завершив преобразование, вы можете сохранить .rso-файлы со звуками во флеш-память NXT при помощи другой утилиты (меню "Tools" / "NXT explorer"), после чего их можно будет воспроизводить командой

PlayFileEx(filename, volume, loop?)

Аргументы команды - имя файла, громкость (число от 0 до 4), и необязательный флаг зацикливания "loop", выставьте его в 1 (или TRUE), если хотите, чтобы файл вопроизвёлся не один раз, выставление его в 0 (или FALSE) воспроизведёт файл один раз.

#define TIME 200
#define MAXVOL 7
#define MINVOL 1
#define MIDVOL 3
#define pause_4th Wait(TIME)
#define pause_8th Wait(TIME/2)
#define note_4th \
PlayFileEx("! Click.rso",MIDVOL,FALSE); pause_4th
#define note_8th \
PlayFileEx("! Click.rso",MAXVOL,FALSE); pause_8th
task main()
{
  PlayFileEx("! Startup.rso",MINVOL,FALSE);
  Wait(2000);
  note_4th;
  note_8th;
  note_8th;
  note_4th;
  note_4th;
  pause_4th;
  note_4th;
  note_4th;
  Wait(100);
}

Эта забавная программа сначала проигрывает звук начала работы, который вы возможно уже слышали, а затем использует стандартный звук "click" чтобы сыграть джингл “Shave and a haircut” который приводит в восторг кролика Роджера! Макрос действительно очень удобен в данном случае для упрощения записи команд в главное задаче: попробуйте модифицировать настройки громкости чтобы сделать мелодию наиболее приятной.

Играем музыку

Чтобы воспроизвести тоновый сигнал вы можете использовать команду PlayToneEx(frequency, duration, volume, loop?) Она имеет 4 параметра. Первый это частота тона в Герцах, второй - продолжительность в 1/1000 секунды (как в операторе "wait"), и последний - такой же флаг зацикливания, как и в предыдущей команде. Кроме того может быть использована команда PlayTone(frequency, duration), в этом случае громкость используется настроенная в меню вашего модуля NXT, а функция зацикливания недоступна.

Вот таблица с полезными частотами музыкальных нот по октавам:

Нота 3 4 5 6 7 8 9
B (Си) 247 494 988 1976 3951 7902
A# (Ля-диез) 233 466 932 1865 3729 7458
A (Ля) 220 440 880 1760 3520 7040 14080
G# (Соль-диез) 415 831 1661 3322 6644 13288
G (Соль) 392 784 1568 3136 6272 12544
F# (Фа-диез) 370 740 1480 2960 5920 11840
F (Фа) 349 698 1397 2794 5588 11176
E (Ми) 330 659 1319 2637 5274 10548
D# (Ре-диез) 311 622 1245 2489 4978 9956
D (Ре) 294 587 1175 2349 4699 9398
C# (До-диез) 277 554 1109 2217 4435 8870
C (До) 262 523 1047 2093 4186 8372

Как и в случае с PlayFileEx, модуль NXT не дожидается когда нота доиграет. Так что если вы хотите воспроизвести подряд несколько нот - вам придётся добавить между ними достаточно долгие команды "wait". Например вот так:

#define VOL 3
task main()
{
PlayToneEx(262,400,VOL,FALSE); Wait(500);
PlayToneEx(294,400,VOL,FALSE); Wait(500);
PlayToneEx(330,400,VOL,FALSE); Wait(500);
PlayToneEx(294,400,VOL,FALSE); Wait(500);
PlayToneEx(262,1600,VOL,FALSE); Wait(2000);
}

Вы можете с легкость создавать музыкальные фрагменты с использованием инструмента "Brick Piano", являющегося частью BricxCC.

Если вы хотите, чтобы NXT играл музыку, когда выполнял различные задачи - лучше используйте для этого отдельную задачу. Вот пример достаточно достаточно глупой программы, где NXT ездит взад-вперед и параллельно играет музыку.

task music()
{
  while (true)
  {
    PlayTone(262,400); Wait(500);
    PlayTone(294,400); Wait(500);
    PlayTone(330,400); Wait(500);
    PlayTone(294,400); Wait(500);
  }
}

task movement()
{
  while(true)
  {
    OnFwd(OUT_AC, 75); Wait(3000);
    OnRev(OUT_AC, 75); Wait(3000);
  }
}

task main()
{
  Precedes(music, movement);
}

Подводим итоги

В этой главе вы научились как с помощью NXT проигрывать звуки и музыку. Кроме того вы увидели, как использовать отдельную задачу для воспроизведения музыки.