Программирование LEGO NXT роботов на языке NXC - Создаём музыку — различия между версиями
=DeaD= (обсуждение | вклад) (→Играем музыку) |
=DeaD= (обсуждение | вклад) (→Играем музыку) |
||
(не показано 7 промежуточных версий этого же участника) | |||
Строка 2: | Строка 2: | ||
=Создаём музыку= | =Создаём музыку= | ||
− | + | Модуль NXT имеет встроенный динамик и может воспроизводить музыку и даже звуковые файлы. Это может быть полезно в том случае, когда вы хотите чтобы NXT сказал вам, что что-то случилось. Но это также может быть просто более интересно, когда робот играет музыку или разговаривает в процессе выполнения заданий. | |
− | |||
− | |||
==Проигрываем звуковые файлы== | ==Проигрываем звуковые файлы== | ||
− | BricxCC | + | BricxCC содержит в себе встроенную утилиту для преобразования .wav-файлов в .rso-файлы, доступную через меню "Tools" / "Sound conversion". |
− | + | ||
− | (Tools | + | Завершив преобразование, вы можете сохранить .rso-файлы со звуками во флеш-память NXT при помощи другой утилиты (меню "Tools" / "NXT explorer"), после чего их можно будет воспроизводить командой |
PlayFileEx(filename, volume, loop?) | PlayFileEx(filename, volume, loop?) | ||
− | + | Аргументы команды - имя файла, громкость (число от 0 до 4), и необязательный флаг зацикливания "loop", выставьте его в 1 (или TRUE), если хотите, чтобы файл вопроизвёлся не один раз, выставление его в 0 (или FALSE) воспроизведёт файл один раз. | |
− | (TRUE) | ||
#define TIME 200 | #define TIME 200 | ||
Строка 41: | Строка 38: | ||
} | } | ||
− | + | Эта забавная программа сначала проигрывает звук начала работы, который вы возможно уже слышали, а затем использует стандартный звук "click" чтобы сыграть джингл “Shave and a haircut” который приводит в восторг кролика Роджера! Макрос действительно очень удобен в данном случае для упрощения записи команд в главное задаче: попробуйте модифицировать настройки громкости чтобы сделать мелодию наиболее приятной. | |
− | |||
− | |||
==Играем музыку== | ==Играем музыку== | ||
− | + | Чтобы воспроизвести тоновый сигнал вы можете использовать команду PlayToneEx(frequency, duration, volume, loop?) | |
− | + | Она имеет 4 параметра. Первый это частота тона в Герцах, второй - продолжительность в 1/1000 секунды (как в операторе "wait"), и последний - такой же флаг зацикливания, как и в предыдущей команде. Кроме того может быть использована команда PlayTone(frequency, duration), в этом случае громкость используется настроенная в меню вашего модуля NXT, а функция зацикливания недоступна. | |
− | |||
− | |||
− | + | Вот таблица с полезными частотами музыкальных нот по октавам: | |
− | {| | + | {| class="standard" |
− | | | + | |Нота |
|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 | ||
|831 | |831 | ||
Строка 96: | Строка 90: | ||
|13288 | |13288 | ||
|- | |- | ||
− | |G | + | |G (Соль) |
+ | | | ||
|392 | |392 | ||
|784 | |784 | ||
Строка 104: | Строка 99: | ||
|12544 | |12544 | ||
|- | |- | ||
− | |F# | + | |F# (Фа-диез) |
+ | | | ||
|370 | |370 | ||
|740 | |740 | ||
Строка 112: | Строка 108: | ||
|11840 | |11840 | ||
|- | |- | ||
− | |F | + | |F (Фа) |
+ | | | ||
|349 | |349 | ||
|698 | |698 | ||
Строка 120: | Строка 117: | ||
|11176 | |11176 | ||
|- | |- | ||
− | E 330 659 1319 2637 5274 10548 | + | |E (Ми) |
− | D# 311 622 1245 2489 4978 9956 | + | | |
− | D 294 587 1175 2349 4699 9398 | + | |330 |
− | C# 277 554 1109 2217 4435 8870 | + | |659 |
− | C 262 523 1047 2093 4186 8372 | + | |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 | #define VOL 3 | ||
Строка 140: | Строка 175: | ||
} | } | ||
− | + | Вы можете с легкость создавать музыкальные фрагменты с использованием инструмента "Brick Piano", являющегося частью BricxCC. | |
− | + | Если вы хотите, чтобы NXT играл музыку, когда выполнял различные задачи - лучше используйте для этого отдельную задачу. Вот пример достаточно достаточно глупой программы, где NXT ездит взад-вперед и параллельно играет музыку. | |
− | |||
task music() | task music() | ||
Строка 171: | Строка 205: | ||
==Подводим итоги== | ==Подводим итоги== | ||
− | + | В этой главе вы научились как с помощью NXT проигрывать звуки и музыку. Кроме того вы увидели, как использовать отдельную задачу для воспроизведения музыки. | |
− |
Текущая версия на 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 проигрывать звуки и музыку. Кроме того вы увидели, как использовать отдельную задачу для воспроизведения музыки.