Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
33e6372bf0 | ||
|
83bba14a4d | ||
|
0d7c1f0d50 | ||
|
623e57a30e | ||
|
91235fb6d3 |
@@ -116,7 +116,7 @@ export class Ev3Wrapper {
|
|||||||
if (this.dataDump)
|
if (this.dataDump)
|
||||||
log("TALK: " + U.toHex(buf))
|
log("TALK: " + U.toHex(buf))
|
||||||
return this.io.sendPacketAsync(buf)
|
return this.io.sendPacketAsync(buf)
|
||||||
.then(() => this.msgs.shiftAsync(1000))
|
.then(() => this.msgs.shiftAsync(5000))
|
||||||
.then(resp => {
|
.then(resp => {
|
||||||
if (resp[2] != buf[2] || resp[3] != buf[3])
|
if (resp[2] != buf[2] || resp[3] != buf[3])
|
||||||
U.userError("msg count de-sync")
|
U.userError("msg count de-sync")
|
||||||
|
@@ -12,4 +12,5 @@ music.setTempo(120)
|
|||||||
music.noteFrequency(Note.C)
|
music.noteFrequency(Note.C)
|
||||||
music.beat()
|
music.beat()
|
||||||
music.setVolume(50)
|
music.setVolume(50)
|
||||||
|
music.volume()
|
||||||
```
|
```
|
@@ -13,7 +13,22 @@
|
|||||||
|
|
||||||
namespace music {
|
namespace music {
|
||||||
|
|
||||||
uint8_t currVolume = 50;
|
int _readSystemVolume() {
|
||||||
|
char ParBuf[8];
|
||||||
|
int volume;
|
||||||
|
|
||||||
|
int fd = open("../sys/settings/Volume.rtf", O_RDONLY);
|
||||||
|
read(fd, ParBuf, sizeof(ParBuf));
|
||||||
|
close(fd);
|
||||||
|
if (sscanf(ParBuf,"%d",&volume) > 0) {
|
||||||
|
if ((volume >= 0) && (volume <= 100)) {
|
||||||
|
return volume;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t currVolume = _readSystemVolume();
|
||||||
uint8_t *lmsSoundMMap;
|
uint8_t *lmsSoundMMap;
|
||||||
|
|
||||||
int writeDev(void *data, int size) {
|
int writeDev(void *data, int size) {
|
||||||
@@ -37,6 +52,18 @@ void setVolume(int volume) {
|
|||||||
currVolume = max(0, min(100, volume));
|
currVolume = max(0, min(100, volume));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the output volume of the sound synthesizer.
|
||||||
|
*/
|
||||||
|
//% weight=96
|
||||||
|
//% blockId=synth_get_volume block="volume"
|
||||||
|
//% parts="speaker" blockGap=8
|
||||||
|
//% help=music/volume
|
||||||
|
//% weight=1
|
||||||
|
int volume() {
|
||||||
|
return currVolume;
|
||||||
|
}
|
||||||
|
|
||||||
#define SOUND_CMD_BREAK 0
|
#define SOUND_CMD_BREAK 0
|
||||||
#define SOUND_CMD_TONE 1
|
#define SOUND_CMD_TONE 1
|
||||||
#define SOUND_CMD_PLAY 2
|
#define SOUND_CMD_PLAY 2
|
||||||
@@ -45,7 +72,7 @@ void setVolume(int volume) {
|
|||||||
|
|
||||||
struct ToneCmd {
|
struct ToneCmd {
|
||||||
uint8_t cmd;
|
uint8_t cmd;
|
||||||
uint8_t vol;
|
uint8_t lvl;
|
||||||
uint16_t freq;
|
uint16_t freq;
|
||||||
uint16_t duration;
|
uint16_t duration;
|
||||||
};
|
};
|
||||||
@@ -55,10 +82,26 @@ static void _stopSound() {
|
|||||||
writeDev(&cmd, sizeof(cmd));
|
writeDev(&cmd, sizeof(cmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t _getVolumeLevel(uint8_t volume, uint8_t levels) {
|
||||||
|
uint8_t level;
|
||||||
|
uint8_t step = (uint8_t) (100 / (levels - 1));
|
||||||
|
if (volume < step) {
|
||||||
|
level = 0;
|
||||||
|
} else if (volume > step * (levels - 1)) {
|
||||||
|
level = levels;
|
||||||
|
} else {
|
||||||
|
level = (uint8_t) (volume / step);
|
||||||
|
}
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
static void _playTone(uint16_t frequency, uint16_t duration, uint8_t volume) {
|
static void _playTone(uint16_t frequency, uint16_t duration, uint8_t volume) {
|
||||||
|
// https://github.com/mindboards/ev3sources/blob/78ebaf5b6f8fe31cc17aa5dce0f8e4916a4fc072/lms2012/c_sound/source/c_sound.c#L471
|
||||||
|
uint8_t level = _getVolumeLevel(volume, 13);
|
||||||
|
|
||||||
ToneCmd cmd;
|
ToneCmd cmd;
|
||||||
cmd.cmd = SOUND_CMD_TONE;
|
cmd.cmd = SOUND_CMD_TONE;
|
||||||
cmd.vol = volume;
|
cmd.lvl = level;
|
||||||
cmd.freq = frequency;
|
cmd.freq = frequency;
|
||||||
cmd.duration = duration;
|
cmd.duration = duration;
|
||||||
// (*SoundInstance.pSound).Busy = TRUE;
|
// (*SoundInstance.pSound).Busy = TRUE;
|
||||||
@@ -122,7 +165,8 @@ void playSample(Buffer buf) {
|
|||||||
stopUser();
|
stopUser();
|
||||||
pthread_mutex_lock(&pumpMutex);
|
pthread_mutex_lock(&pumpMutex);
|
||||||
*lmsSoundMMap = 1; // BUSY
|
*lmsSoundMMap = 1; // BUSY
|
||||||
uint8_t cmd[] = {SOUND_CMD_PLAY, (uint8_t)((currVolume / 33) + 1)};
|
// https://github.com/mindboards/ev3sources/blob/78ebaf5b6f8fe31cc17aa5dce0f8e4916a4fc072/lms2012/c_sound/source/c_sound.c#L605
|
||||||
|
uint8_t cmd[] = {SOUND_CMD_PLAY, _getVolumeLevel(currVolume, 8)};
|
||||||
writeDev(cmd, 2);
|
writeDev(cmd, 2);
|
||||||
decrRC(currentSample);
|
decrRC(currentSample);
|
||||||
currentSample = buf;
|
currentSample = buf;
|
||||||
|
10
libs/music/shims.d.ts
vendored
10
libs/music/shims.d.ts
vendored
@@ -13,6 +13,16 @@ declare namespace music {
|
|||||||
//% weight=1 shim=music::setVolume
|
//% weight=1 shim=music::setVolume
|
||||||
function setVolume(volume: int32): void;
|
function setVolume(volume: int32): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the output volume of the sound synthesizer.
|
||||||
|
*/
|
||||||
|
//% weight=96
|
||||||
|
//% blockId=synth_get_volume block="volume"
|
||||||
|
//% parts="speaker" blockGap=8
|
||||||
|
//% help=music/volume
|
||||||
|
//% weight=1 shim=music::volume
|
||||||
|
function volume(): int32;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Play a tone through the speaker for some amount of time.
|
* Play a tone through the speaker for some amount of time.
|
||||||
* @param frequency pitch of the tone to play in Hertz (Hz), eg: Note.C
|
* @param frequency pitch of the tone to play in Hertz (Hz), eg: Note.C
|
||||||
|
@@ -5,3 +5,4 @@ music.playTone(1440, 500)
|
|||||||
pause(500)
|
pause(500)
|
||||||
music.playTone(2440, 500)
|
music.playTone(2440, 500)
|
||||||
pause(500)
|
pause(500)
|
||||||
|
music.volume()
|
||||||
|
5105
package-lock.json
generated
Normal file
5105
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pxt-ev3",
|
"name": "pxt-ev3",
|
||||||
"version": "1.2.28",
|
"version": "1.2.30",
|
||||||
"description": "LEGO MINDSTORMS EV3 for Microsoft MakeCode",
|
"description": "LEGO MINDSTORMS EV3 for Microsoft MakeCode",
|
||||||
"private": false,
|
"private": false,
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
@@ -7,6 +7,14 @@ namespace pxsim.music {
|
|||||||
export function stopAllSounds() {
|
export function stopAllSounds() {
|
||||||
SoundMethods.stop()
|
SoundMethods.stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pxsim.music.setVolume = (volume: number): void => {
|
||||||
|
pxsim.getAudioState().volume = volume;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function volume() {
|
||||||
|
return pxsim.getAudioState().volume;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace pxsim.SoundMethods {
|
namespace pxsim.SoundMethods {
|
||||||
|
Reference in New Issue
Block a user