How to Make Lego NXT to Play a Sound
By Anna Sandler
Usages
How to play a sound on the NXT:
- PlayTone command- Start a playback of a MIDI tone specified by frequency
in Hz and duration is milliseconds;
- PlaySoundFile command- Start a playback of a specified existing RSO file.
You can either download a file to the NXT’s brick using Bluetooth,
or you can use a file
handling commands to transfer the file from your device programmatically;
- Use the StopSoundPlayback command to stop the playback.
In case of playing the sound file in a loop (or if you just want to stop the playing
operation earlier).
This command is valid for both PlayTone and PlaySoundFile;
Sound play command types
Sound play commands are part of the "Direct commands".
There are two relevant command types for a direct command:
- 0x00 for a command with reply message, and
- 0x80 for a command without the reply message.
Sound file name
Sound file name format consists from:
[name, up to 15 ASCII characters].rso[string NULL terminator 0x00].
The system is case insensitive, meaning uppercase characters are treated the same as lower case characters.
Frequency to note mapper

Lego NXT Programming Over Bluetooth Frequency Note Mapper
PlayTone command
This command is used to play a MIDI tone specified by frequency in Hz, and duration is milliseconds.
The playback won’t be stopped as the program/ robot-app is finished.
Use the StopSoundPlayback command to interrupt the playing process earlier.
Syntax
[0x06] [0x00] [0x00 or 0x80] [0x03] [Frequency byte LSB] [Frequency byte MSB] [Duration byte LSB] [Duration byte MSB]
Explanation:
- Byte 0-1: Command length LSB first.
- Byte 2: Command type- direct command.
Since no error will be retrieved in any case, we can’t find a reason to ask for a response message,
therefore, use always the 0x80 as a command type.
If, for some reason, you are of those who just can’t live without unnecessary messages from the robot,
in this case use the 0x00 as a command type.
- Byte 3: Command- play a sound.
- Byte 4-5: Frequency for the tone in Hz.
Make sure the value range is 200-1400.
There is no error message if the value is out of range. LSB first.
Take a look at the “Frequency to note mapper” chart above to choose the relevant note.
Make sure to round the Hz number when you send the value.
- Byte 6-7: Duration of the tone is milliseconds. LSB first.
The reply message that is coming back (if requested) will always look like:
[0x03] [0x00] [0x02] [0x03] [0x00]
Explanation:
- Byte 0-1: Message length LSB first.
- Byte 2: Command type- reply message
- Byte 3: Command that has requested for this reply.
- Byte 4: Command status- 0x00 for success or a theoretic error number for failure.
This command will not retrieve an error in any case.
Example:
Let’s play a Mi (C in the mapping chart) sound for half a second.
The command that is sent to NXT is:
0x06 0x00 0x00 0x03 0x0B 0x02 0xF4 0x01
The command that is received from NXT as a reply is:
0x03 0x00 0x02 0x03 0x00
PlaySoundFile command
This command is used to play a specified existing RSO file.
Make sure you use a valid rso file. The system will not notify in case of existing file from a different type.
The playback won’t be stopped as the program/ robot-app is finished.
Use the StopSoundPlayback command to interrupt the playing process earlier.
Syntax
[0x17] [0x00] [0x00 or 0x80] [0x02] [0x00 or 0x01] [fileName.rso]
Explanation:
- Byte 0-1: Command length LSB first.
- Byte 2: Command type- direct command.
For direct command with response message use 0x00, otherwise, for direct command without the reply message, use 0x80.
- Byte 3: Command- play a sound file.
- Byte 4: Play in a loop.
For playing the sound file only once use 0x0,
otherwise, for playing the sound file indefinitely use 0x01.
- Byte 5-24: Sound file name, including its extension- rso.
The system is case insensitive.
The bytes of file name and type characters should be ASCII encoded.
NULL terminator must appear at the end ('\0').
In case the name of the file is shorter than 15 characters,
NULL terminator byte should be added to the end of the file name extension for each missing character.
Total file name characters, including the NULL terminators, should always be 20.
The reply message that is coming back (if requested) looks like:
[0x03] [0x00] [0x02] [0x02] [0x00 or error]
Explanation:
- Byte 0-1: Message length LSB first.
- Byte 2: Command type- reply message
- Byte 3: Command that has requested for this reply.
- Byte 4: Command status- 0x00 for success or error number for failure. Check
the
NXT File Handling over Bluetooth- Introduction chapter for error numbers.
Example:
Play the Woops.rso sound file only once.
The command that is sent to NXT is:
0x17 0x00 0x00 0x02 0x00 woops.rso\0\0\0\0\0\0\0\0\0\0\0
The command that is received from NXT as a reply is:
0x03 0x00 0x02 0x02 0x00
StopSoundPlayback command
This command is used to stop the playback for both PlayTone and PlaySoundFile commands.
Syntax
[0x02] [0x00] [0x00 or 0x80] [0x0C]
Explanation:
- Byte 0-1: Command length LSB first.
- Byte 2: Command type- direct command.
Since no error will be retrieved in any case, we can’t find a reason to ask for a response message,
therefore, use always the 0x80 as a command type.
If, for some reason, you are of those who just can’t live without unnecessary messages from the robot,
in this case use the 0x00 as a command type.
- Byte 3: Command- stop the sound.
The reply message that is coming back (if requested) will always look like:
[0x03] [0x00] [0x02] [0x0C] [0x00]
Explanation:
- Byte 0-1: Message length LSB first.
- Byte 2: Command type- reply message
- Byte 3: Command that has requested for this reply.
- Byte 4: Command status- 0x00 for success or a theoretic error number for failure.
This command will not retrieve an error in any case.
Example:
PlayTone command has been sent with a very long duration,
or PlaySoundFile command has requested a playback to be in a loop.
In order to stop the playback, StopSoundPlayback command is being sent.
The command that is sent to NXT is:
0x02 0x00 0x00 0x0C
The command that is received from NXT as a reply is:
0x03 0x00 0x02 0x0C 0x00
What's next?
canada drug pharmacy coupon
go internet drug coupons