From d99c6d18a8901393c4809ae1786b18a562a4d06d Mon Sep 17 00:00:00 2001 From: Juri Wolf Date: Fri, 28 Nov 2025 18:46:18 +0100 Subject: [PATCH 1/5] Update beta reference to v8.1.9 --- docs/beta-ref.json | 2 +- libs/core/music.ts | 287 ++++++++++++++++++++++++--------------------- 2 files changed, 157 insertions(+), 132 deletions(-) diff --git a/docs/beta-ref.json b/docs/beta-ref.json index 242f6a05..bcc26187 100644 --- a/docs/beta-ref.json +++ b/docs/beta-ref.json @@ -1,3 +1,3 @@ { - "appref": "v8" + "appref": "v8.1.9" } \ No newline at end of file diff --git a/libs/core/music.ts b/libs/core/music.ts index d5838bd5..34eecb97 100644 --- a/libs/core/music.ts +++ b/libs/core/music.ts @@ -199,6 +199,7 @@ namespace music { //% parts="speaker" //% useEnumVal=1 //% group="Tone" + //% deprecated=1 export function playTone(frequency: number, ms: number): void { if (isNaN(frequency) || isNaN(ms)) return; if (_playTone) _playTone(frequency, ms); @@ -242,7 +243,6 @@ namespace music { //% useEnumVal=1 //% group="Tone" //% blockGap=8 - //% blockHidden=true export function noteFrequency(name: Note): number { return name; } @@ -326,19 +326,41 @@ namespace music { //% blockId=device_builtin_melody block="%melody" //% blockHidden=true //% group="Melody Advanced" - //% advanced=true //% deprecated=1 export function builtInMelody(melody: Melodies): string[] { return getMelody(melody); } + // /** + // * Gets the melody array of a built-in melody. + // * @param melody the melody name + // */ + // //% weight=60 help=music/built-in-playable-melody + // //% blockId=device_builtin_melody_playable block="melody $melody" + // //% toolboxParent=music_playable_play_default_bkg + // //% toolboxParentArgument=toPlay + // //% duplicateShadowOnDrag + // //% group="Melody Advanced" + // export function builtInPlayableMelody(melody: Melodies): StringArrayPlayable { + // return new StringArrayPlayable(getMelody(melody), undefined); + // } + + // /** + // * Registers code to run on various melody events + // */ + // //% blockId=melody_on_event block="music on %value" + // //% help=music/on-event weight=59 blockGap=32 + // //% group="Melody Advanced" + // export function onEvent(value: MusicEvent, handler: () => void) { + // control.onEvent(MICROBIT_MELODY_ID, value, handler); + // } + /** * Use startMelody instead */ //% hidden=1 deprecated=1 //% parts="speaker" //% group="Melody Advanced" - //% advanced=true export function beginMelody(melodyArray: string[], options: MelodyOptions = 1) { return startMelodyInternal(melodyArray, options); } @@ -353,7 +375,6 @@ namespace music { //% blockId=device_start_melody block="start melody %melody=device_builtin_melody| repeating %options" //% parts="speaker" //% group="Melody Advanced" - //% advanced=true //% deprecated=1 export function startMelody(melodyArray: string[], options: MelodyOptions = 1) { return startMelodyInternal(melodyArray, options); @@ -371,6 +392,7 @@ namespace music { //% tempo.defl=120 //% parts="speaker" //% group="Melody" + //% deprecated=1 export function playMelody(melody: string, tempo: number) { melody = melody || ""; setTempo(tempo); @@ -380,7 +402,6 @@ namespace music { waitForMelodyEnd(); } - // Shared code between begin, start, and play Melody blocks (all deprecated), plus StringPlayable.play (NOT deprecated). export function startMelodyInternal(melodyArray: string[], options: MelodyOptions) { init(); @@ -482,6 +503,14 @@ namespace music { startMelody([], MelodyOptions.Once); } + // MOVED TO CORE MINI CODAL + // export function _onStopSound(handler: () => void) { + // if (!stopSoundHandlers) { + // stopSoundHandlers = []; + // } + // stopSoundHandlers.push(handler); + // } + /** * Stop all sounds and melodies currently playing. */ @@ -501,17 +530,17 @@ namespace music { } } + /** * Sets a custom playTone function for playing melodies */ //% help=music/set-play-tone - //% advanced=true //% group="Tone" export function setPlayTone(f: (frequency: number, duration: number) => void) { _playTone = f; } - /** + /** * Converts an octave and note offset into an integer frequency. * Returns 0 if the note is out of range. * @@ -519,149 +548,145 @@ namespace music { * @param note The offset of the note within the octave * @returns A frequency in HZ or 0 if out of range */ - export function getFrequencyForNote(octave: number, note: number) { - return freqs.getNumber(NumberFormat.UInt16LE, (note + (12 * (octave - 1))) * 2) || 0; -} - -/* - * Converts a simple positive string to an integer. - * Pxt-common's parseInt is more robust, but it has a fairly large code size footprint. - * When we know the provided string will be a simple number, we can use this instead, - * which takes some shortcuts but does not use nearly as much space. - */ -function parseIntSimple(text: string) { - let result = 0; - for (let i = 0; i < text.length; ++i) { - const c = text.charCodeAt(i) - 48; - if (c < 0 || c > 9) return NaN; - result = result * 10 + c; + export function getFrequencyForNote(octave: number, note: number) { + return freqs.getNumber(NumberFormat.UInt16LE, (note + (12 * (octave - 1))) * 2) || 0; } - return result; -} -function playNextNote(melody: Melody): void { - // cache elements - let currNote = melody.nextNote(); - let currentPos = melody.currentPos; - let currentDuration = melody.currentDuration; - let currentOctave = melody.currentOctave; - - let note: number; - let isrest: boolean = false; - let beatPos: number; - let parsingOctave: boolean = true; - let prevNote: boolean = false; - - for (let pos = 0; pos < currNote.length; pos++) { - let noteChar = currNote.charAt(pos); - switch (noteChar) { - case 'c': case 'C': note = 1; prevNote = true; break; - case 'd': case 'D': note = 3; prevNote = true; break; - case 'e': case 'E': note = 5; prevNote = true; break; - case 'f': case 'F': note = 6; prevNote = true; break; - case 'g': case 'G': note = 8; prevNote = true; break; - case 'a': case 'A': note = 10; prevNote = true; break; - case 'B': note = 12; prevNote = true; break; - case 'r': case 'R': isrest = true; prevNote = false; break; - case '#': note++; prevNote = false; break; - case 'b': if (prevNote) note--; else { note = 12; prevNote = true; } break; - case ':': parsingOctave = false; beatPos = pos; prevNote = false; break; - default: prevNote = false; if (parsingOctave) currentOctave = parseIntSimple(noteChar); + /* + * Converts a simple positive string to an integer. + * Pxt-common's parseInt is more robust, but it has a fairly large code size footprint. + * When we know the provided string will be a simple number, we can use this instead, + * which takes some shortcuts but does not use nearly as much space. + */ + function parseIntSimple(text: string) { + let result = 0; + for (let i = 0; i < text.length; ++i) { + const c = text.charCodeAt(i) - 48; + if (c < 0 || c > 9) return NaN; + result = result * 10 + c; } + return result; } - if (!parsingOctave) { - currentDuration = parseIntSimple(currNote.substr(beatPos + 1, currNote.length - beatPos)); - } - let beat = Math.idiv(60000, beatsPerMinute) >> 2; - if (isrest) { - music.rest(currentDuration * beat) - } else { - music.playTone(getFrequencyForNote(currentOctave, note), currentDuration * beat); - } - melody.currentDuration = currentDuration; - melody.currentOctave = currentOctave; - const repeating = melody.repeating && currentPos == melody.melodyArray.length - 1; - melody.currentPos = repeating ? 0 : currentPos + 1; - - control.raiseEvent(MICROBIT_MELODY_ID, melody.background | MusicEvent.MelodyNotePlayed); - if (repeating) - control.raiseEvent(MICROBIT_MELODY_ID, melody.background | MusicEvent.MelodyRepeated); -} - - -class Melody { - public melodyArray: string[]; - public currentDuration: number; - public currentOctave: number; - public currentPos: number; - public repeating: boolean; - // This is bitwise or'd with the events. 0 is not in background, 0xf0 if in background - public background: number; - - constructor(melodyArray: string[], options: MelodyOptions) { - this.melodyArray = melodyArray; - this.repeating = !!(options & (MelodyOptions.Forever | MelodyOptions.ForeverInBackground)); - this.background = (options & (MelodyOptions.OnceInBackground | MelodyOptions.ForeverInBackground)) ? 0xf0 : 0; - this.currentDuration = 4; //Default duration (Crotchet) - this.currentOctave = 4; //Middle octave - this.currentPos = 0; + function playNextNote(melody: Melody): void { + // cache elements + let currNote = melody.nextNote(); + let currentPos = melody.currentPos; + let currentDuration = melody.currentDuration; + let currentOctave = melody.currentOctave; + + let note: number; + let isrest: boolean = false; + let beatPos: number; + let parsingOctave: boolean = true; + let prevNote: boolean = false; + + for (let pos = 0; pos < currNote.length; pos++) { + let noteChar = currNote.charAt(pos); + switch (noteChar) { + case 'c': case 'C': note = 1; prevNote = true; break; + case 'd': case 'D': note = 3; prevNote = true; break; + case 'e': case 'E': note = 5; prevNote = true; break; + case 'f': case 'F': note = 6; prevNote = true; break; + case 'g': case 'G': note = 8; prevNote = true; break; + case 'a': case 'A': note = 10; prevNote = true; break; + case 'B': note = 12; prevNote = true; break; + case 'r': case 'R': isrest = true; prevNote = false; break; + case '#': note++; prevNote = false; break; + case 'b': if (prevNote) note--; else { note = 12; prevNote = true; } break; + case ':': parsingOctave = false; beatPos = pos; prevNote = false; break; + default: prevNote = false; if (parsingOctave) currentOctave = parseIntSimple(noteChar); + } + } + if (!parsingOctave) { + currentDuration = parseIntSimple(currNote.substr(beatPos + 1, currNote.length - beatPos)); + } + let beat = Math.idiv(60000, beatsPerMinute) >> 2; + if (isrest) { + music.rest(currentDuration * beat) + } else { + music.playTone(getFrequencyForNote(currentOctave, note), currentDuration * beat); + } + melody.currentDuration = currentDuration; + melody.currentOctave = currentOctave; + const repeating = melody.repeating && currentPos == melody.melodyArray.length - 1; + melody.currentPos = repeating ? 0 : currentPos + 1; + + control.raiseEvent(MICROBIT_MELODY_ID, melody.background | MusicEvent.MelodyNotePlayed); + if (repeating) + control.raiseEvent(MICROBIT_MELODY_ID, melody.background | MusicEvent.MelodyRepeated); } - hasNextNote() { - return this.repeating || this.currentPos < this.melodyArray.length; - } + class Melody { + public melodyArray: string[]; + public currentDuration: number; + public currentOctave: number; + public currentPos: number; + public repeating: boolean; + + // This is bitwise or'd with the events. 0 is not in background, 0xf0 if in background + public background: number; + + constructor(melodyArray: string[], options: MelodyOptions) { + this.melodyArray = melodyArray; + this.repeating = !!(options & (MelodyOptions.Forever | MelodyOptions.ForeverInBackground)); + this.background = (options & (MelodyOptions.OnceInBackground | MelodyOptions.ForeverInBackground)) ? 0xf0 : 0; + this.currentDuration = 4; //Default duration (Crotchet) + this.currentOctave = 4; //Middle octave + this.currentPos = 0; + } + + hasNextNote() { + return this.repeating || this.currentPos < this.melodyArray.length; + } - nextNote(): string { - const currentNote = this.melodyArray[this.currentPos]; - return currentNote; + nextNote(): string { + const currentNote = this.melodyArray[this.currentPos]; + return currentNote; + } } -} + export function _bufferToMelody(melody: Buffer) { + if (!melody) return []; -export function _bufferToMelody(melody: Buffer) { - if (!melody) return []; + let currentDuration = 4; + let currentOctave = -1; + const out: string[] = []; - let currentDuration = 4; - let currentOctave = -1; - const out: string[] = []; + const notes = "c#d#ef#g#a#b" + let current = ""; - const notes = "c#d#ef#g#a#b" - let current = ""; + // The buffer format is 2 bytes per note. First note byte is midi + // note number, second byte is duration in quarter beats. The note + // number 0 is reserved for rests + for (let i = 0; i < melody.length; i += 2) { + let octave = 4; + const note = melody[i] % 12; + if (melody[i] === 0) { + current = "r" + } + else { + current = notes.charAt(note); + if (current === "#") current = notes.charAt(note - 1) + current - // The buffer format is 2 bytes per note. First note byte is midi - // note number, second byte is duration in quarter beats. The note - // number 0 is reserved for rests - for (let i = 0; i < melody.length; i += 2) { - let octave = 4; - const note = melody[i] % 12; - if (melody[i] === 0) { - current = "r" - } - else { - current = notes.charAt(note); - if (current === "#") current = notes.charAt(note - 1) + current + octave = Math.idiv((melody[i] - 24), 12) + } - octave = Math.idiv((melody[i] - 24), 12) - } + const duration = melody[i + 1]; - const duration = melody[i + 1]; + if (octave !== currentOctave) { + current += octave + currentOctave = octave; + } - if (octave !== currentOctave) { - current += octave - currentOctave = octave; - } + if (duration !== currentDuration) { + current += ":" + duration; + currentDuration = duration; + } - if (duration !== currentDuration) { - current += ":" + duration; - currentDuration = duration; + out.push(current); } - out.push(current); + return out; } - - return out; } - - -} \ No newline at end of file From 56b06236e58c6c8f79ea276768f29666b19ec217 Mon Sep 17 00:00:00 2001 From: Juri Wolf Date: Fri, 28 Nov 2025 18:48:44 +0100 Subject: [PATCH 2/5] Update codalTarget branch to v0.3.2-calliope-3 with fixed reset pin alias --- pxtarget.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pxtarget.json b/pxtarget.json index 4619fac7..ae5e69d7 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -226,7 +226,7 @@ "codalTarget": { "name": "codal-microbit-v2", "url": "https://github.com/calliope-edu/codal-microbit-v2", - "branch": "v0.3.2_ble_fix", + "branch": "v0.3.2-calliope-3", "type": "git" }, "codalBinary": "MICROBIT", From a340f6805096d5d39b61ef3269cd5041e1fc1838 Mon Sep 17 00:00:00 2001 From: Juri Wolf Date: Tue, 2 Dec 2025 17:50:50 +0100 Subject: [PATCH 3/5] refactor music blocks --- libs/core-mini-codal/music.ts | 24 ----------- libs/core-mini-codal/pxt.json | 1 - libs/core-mini-codal/soundexpressions.ts | 1 - libs/core/music.ts | 50 +++++++++++----------- libs/{core-mini-codal => core}/playable.ts | 1 - libs/core/pxt.json | 1 + libs/core/soundexpressions.cpp | 2 + 7 files changed, 28 insertions(+), 52 deletions(-) rename libs/{core-mini-codal => core}/playable.ts (99%) diff --git a/libs/core-mini-codal/music.ts b/libs/core-mini-codal/music.ts index 5f824d33..6281d133 100644 --- a/libs/core-mini-codal/music.ts +++ b/libs/core-mini-codal/music.ts @@ -1,36 +1,12 @@ /** * Generation of music tones. */ -//% color=#DF4600 weight=98 icon="\uf025" -//% groups='["Melody", "Tone", "Volume", "Silence", "Tempo", "State", "Melody Advanced"]' namespace music { let stopSoundHandlers: (() => void)[]; const MICROBIT_MELODY_ID = 2000; - /** - * Gets the melody array of a built-in melody. - * @param melody the melody name - */ - //% weight=60 help=music/built-in-playable-melody - //% blockId=device_builtin_melody_playable block="melody $melody" - //% toolboxParent=music_playable_play_default_bkg - //% toolboxParentArgument=toPlay - //% duplicateShadowOnDrag - //% group="Melody Advanced" - export function builtInPlayableMelody(melody: Melodies): StringArrayPlayable { - return new StringArrayPlayable(getMelody(melody), undefined); - } - /** - * Registers code to run on various melody events - */ - //% blockId=melody_on_event block="music on %value" - //% help=music/on-event weight=59 blockGap=32 - //% group="Melody Advanced" - export function onEvent(value: MusicEvent, handler: () => void) { - control.onEvent(MICROBIT_MELODY_ID, value, handler); - } export function _onStopSound(handler: () => void) { diff --git a/libs/core-mini-codal/pxt.json b/libs/core-mini-codal/pxt.json index 5a7b63da..ca1f0201 100644 --- a/libs/core-mini-codal/pxt.json +++ b/libs/core-mini-codal/pxt.json @@ -18,7 +18,6 @@ "music.ts", "motors.ts", "soundexpressions.ts", - "playable.ts", "rgbled.ts", "logo.cpp", "touchmode.cpp" diff --git a/libs/core-mini-codal/soundexpressions.ts b/libs/core-mini-codal/soundexpressions.ts index 98ca9eab..894b79c8 100644 --- a/libs/core-mini-codal/soundexpressions.ts +++ b/libs/core-mini-codal/soundexpressions.ts @@ -504,7 +504,6 @@ namespace music { //% block="$soundExpression" //% blockGap=8 //% group="Melody Advanced" - //% advanced=true //% toolboxParent=music_playable_play //% toolboxParentArgument=toPlay //% duplicateShadowOnDrag diff --git a/libs/core/music.ts b/libs/core/music.ts index 34eecb97..15074a79 100644 --- a/libs/core/music.ts +++ b/libs/core/music.ts @@ -331,29 +331,29 @@ namespace music { return getMelody(melody); } - // /** - // * Gets the melody array of a built-in melody. - // * @param melody the melody name - // */ - // //% weight=60 help=music/built-in-playable-melody - // //% blockId=device_builtin_melody_playable block="melody $melody" - // //% toolboxParent=music_playable_play_default_bkg - // //% toolboxParentArgument=toPlay - // //% duplicateShadowOnDrag - // //% group="Melody Advanced" - // export function builtInPlayableMelody(melody: Melodies): StringArrayPlayable { - // return new StringArrayPlayable(getMelody(melody), undefined); - // } + /** + * Gets the melody array of a built-in melody. + * @param melody the melody name + */ + //% weight=60 help=music/built-in-playable-melody + //% blockId=device_builtin_melody_playable block="melody $melody" + //% toolboxParent=music_playable_play_default_bkg + //% toolboxParentArgument=toPlay + //% duplicateShadowOnDrag + //% group="Melody Advanced" + export function builtInPlayableMelody(melody: Melodies): StringArrayPlayable { + return new StringArrayPlayable(getMelody(melody), undefined); + } - // /** - // * Registers code to run on various melody events - // */ - // //% blockId=melody_on_event block="music on %value" - // //% help=music/on-event weight=59 blockGap=32 - // //% group="Melody Advanced" - // export function onEvent(value: MusicEvent, handler: () => void) { - // control.onEvent(MICROBIT_MELODY_ID, value, handler); - // } + /** + * Registers code to run on various melody events + */ + //% blockId=melody_on_event block="music on %value" + //% help=music/on-event weight=59 blockGap=32 + //% group="Melody Advanced" + export function onEvent(value: MusicEvent, handler: () => void) { + control.onEvent(MICROBIT_MELODY_ID, value, handler); + } /** * Use startMelody instead @@ -521,8 +521,8 @@ namespace music { export function stopAllSounds() { rest(0); stopMelody(MelodyStopOptions.All); - // music.__stopSoundExpressions(); - // _stopPlayables(); + music.__stopSoundExpressions(); + _stopPlayables(); if (stopSoundHandlers) { for (const handler of stopSoundHandlers) { handler() @@ -535,7 +535,7 @@ namespace music { * Sets a custom playTone function for playing melodies */ //% help=music/set-play-tone - //% group="Tone" + //% group="Melody Advanced" export function setPlayTone(f: (frequency: number, duration: number) => void) { _playTone = f; } diff --git a/libs/core-mini-codal/playable.ts b/libs/core/playable.ts similarity index 99% rename from libs/core-mini-codal/playable.ts rename to libs/core/playable.ts index e58ce6a7..e07926fc 100644 --- a/libs/core-mini-codal/playable.ts +++ b/libs/core/playable.ts @@ -98,7 +98,6 @@ namespace music { //% playbackMode.defl=music.PlaybackMode.InBackground //% group="Melody" //% help="music/play" - //% blockHidden export function _playDefaultBackground(toPlay: Playable, playbackMode: PlaybackMode) { return play(toPlay, playbackMode); } diff --git a/libs/core/pxt.json b/libs/core/pxt.json index 41f232e0..c3fc4bd9 100644 --- a/libs/core/pxt.json +++ b/libs/core/pxt.json @@ -56,6 +56,7 @@ "poll.ts", "controlmessage.ts", "pxtparts.json", + "playable.ts", "advmath.cpp", "trig.cpp", "fixed.ts", diff --git a/libs/core/soundexpressions.cpp b/libs/core/soundexpressions.cpp index bd4a34d4..529a549a 100644 --- a/libs/core/soundexpressions.cpp +++ b/libs/core/soundexpressions.cpp @@ -23,6 +23,8 @@ namespace music { void __stopSoundExpressions() { #if MICROBIT_CODAL uBit.audio.soundExpressions.stop(); +#else + return; #endif } } \ No newline at end of file From 75a57c7e2037217ff546146d896745d255e4cafd Mon Sep 17 00:00:00 2001 From: Juri Wolf Date: Wed, 3 Dec 2025 11:40:14 +0100 Subject: [PATCH 4/5] Update sound expression groups to categorize under "Sound Effects" --- libs/core-mini-codal/soundexpressions.ts | 6 +++--- libs/core/music.ts | 2 +- libs/core/playable.ts | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/libs/core-mini-codal/soundexpressions.ts b/libs/core-mini-codal/soundexpressions.ts index 894b79c8..e46c6ecd 100644 --- a/libs/core-mini-codal/soundexpressions.ts +++ b/libs/core-mini-codal/soundexpressions.ts @@ -464,7 +464,7 @@ namespace music { //% duplicateWithToolboxParent=music_playable_play //% duplicateWithToolboxParentArgument=toPlay //% duplicateShadowOnDrag - //% group="Melody" + //% group="Sound Effects" export function createSoundExpression(waveShape: WaveShape, startFrequency: number, endFrequency: number, startVolume: number, endVolume: number, duration: number, effect: SoundExpressionEffect, interpolation: InterpolationCurve): SoundExpression { return new SoundExpression(createSoundEffect(waveShape, startFrequency, endFrequency, startVolume, endVolume, duration, effect, interpolation)); } @@ -487,7 +487,7 @@ namespace music { //% blockId=soundExpression_builtinSoundEffect //% block="$soundExpression" //% blockGap=8 - //% group="Melody" + //% group="Sound Effects" //% toolboxParent=soundExpression_playSoundEffect //% toolboxParentArgument=sound //% weight=98 help=music/builtin-sound-effect @@ -503,7 +503,7 @@ namespace music { //% blockId=soundExpression_builtinPlayableSoundEffect //% block="$soundExpression" //% blockGap=8 - //% group="Melody Advanced" + //% group="Sound Effects" //% toolboxParent=music_playable_play //% toolboxParentArgument=toPlay //% duplicateShadowOnDrag diff --git a/libs/core/music.ts b/libs/core/music.ts index 15074a79..a450639b 100644 --- a/libs/core/music.ts +++ b/libs/core/music.ts @@ -173,7 +173,7 @@ enum MusicEvent { * Generation of music tones. */ //% color=#DF4600 weight=98 icon="\uf025" -//% groups='["Melody", "Tone", "Volume", "Silence", "Tempo", "State", "Melody Advanced"]' +//% groups='["Melody", "Tone", "Sound Effects", "Volume", "Silence", "Tempo", "State", "Melody Advanced"]' namespace music { const INTERNAL_MELODY_ENDED = 5; diff --git a/libs/core/playable.ts b/libs/core/playable.ts index e07926fc..e58ce6a7 100644 --- a/libs/core/playable.ts +++ b/libs/core/playable.ts @@ -98,6 +98,7 @@ namespace music { //% playbackMode.defl=music.PlaybackMode.InBackground //% group="Melody" //% help="music/play" + //% blockHidden export function _playDefaultBackground(toPlay: Playable, playbackMode: PlaybackMode) { return play(toPlay, playbackMode); } From 028985a43610d40d17fda17b692c6669845e4935 Mon Sep 17 00:00:00 2001 From: Juri Wolf Date: Mon, 8 Dec 2025 10:15:24 +0100 Subject: [PATCH 5/5] Revert "Update codalTarget branch to v0.3.2-calliope-3 with fixed reset pin alias" This reverts commit 56b06236e58c6c8f79ea276768f29666b19ec217. --- pxtarget.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pxtarget.json b/pxtarget.json index ae5e69d7..4619fac7 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -226,7 +226,7 @@ "codalTarget": { "name": "codal-microbit-v2", "url": "https://github.com/calliope-edu/codal-microbit-v2", - "branch": "v0.3.2-calliope-3", + "branch": "v0.3.2_ble_fix", "type": "git" }, "codalBinary": "MICROBIT",