pxt-microbit 7.0.13 → 7.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/built/block-tests.js +1 -1
  2. package/built/common-sim.js +5 -5
  3. package/built/hexcache/{cb1b89b5febf846e20413f33f34b0649f662c6c856cdfc30b0bc766a37cf0dfa.hex → 0732e6383c21bfe20c40a8e9fe3784db8f5d85289bc7496a4366a5dce01f197c.hex} +6750 -6750
  4. package/built/hexcache/{d9847d963d09454741232337ee6d32ba4a4de678d0995b2829ed46157276a5b2.hex → 2f49babe14d51d847bde5c10754a0acb03db2bb140b9e84b3be886621d6ecc29.hex} +7213 -7213
  5. package/built/hexcache/68c1d66616cdc9b29dab3af0dee93deac852344f969783fe2f39c9758791337a.hex +19720 -0
  6. package/built/hexcache/d7311504e3fadadd391f7e3b175d0bf532c9352419f404676608d2417c615cbc.hex +20321 -0
  7. package/built/sim.d.ts +7 -2
  8. package/built/sim.js +102 -40
  9. package/built/target-strings.json +1 -1
  10. package/built/target.js +1 -1
  11. package/built/target.json +1 -1
  12. package/built/targetlight.json +1 -1
  13. package/built/web/blockly.css +1 -1
  14. package/built/web/rtlblockly.css +1 -1
  15. package/built/web/rtlsemantic.css +3 -3
  16. package/built/web/semantic.css +3 -3
  17. package/docs/courses.md +1 -1
  18. package/docs/extensions/extension-gallery.md +17 -13
  19. package/docs/projects/SUMMARY.md +1 -1
  20. package/docs/projects/hot-potato.md +1 -1
  21. package/docs/projects/level.md +7 -7
  22. package/docs/projects/plot-acceleration.md +1 -1
  23. package/docs/projects/python/smiley-buttons.md +6 -10
  24. package/docs/projects/spy/7-seconds.md +9 -9
  25. package/docs/projects/spy/coin-flipper.md +8 -8
  26. package/docs/projects/spy/compass.md +9 -9
  27. package/docs/projects/spy/heads-guess.md +10 -10
  28. package/docs/projects/spy/hot-potato.md +8 -8
  29. package/docs/projects/spy/level.md +7 -7
  30. package/docs/projects/spy/stopwatch.md +7 -7
  31. package/docs/projects/spy/tug-of-led.md +8 -8
  32. package/docs/projects/stopwatch.md +8 -8
  33. package/docs/projects/tug-of-led.md +8 -8
  34. package/docs/projects/v2-play-sound.md +8 -8
  35. package/docs/reference/basic/show-arrow.md +2 -2
  36. package/docs/reference/basic/show-leds.md +1 -2
  37. package/docs/reference/basic/show-number.md +2 -3
  38. package/docs/reference/basic/show-string.md +2 -4
  39. package/docs/reference/game/clear.md +1 -1
  40. package/docs/reference/images/create-big-image.md +1 -1
  41. package/docs/reference/images/create-image.md +4 -5
  42. package/docs/reference/images/plot-frame.md +1 -1
  43. package/docs/reference/images/plot-image.md +1 -1
  44. package/docs/reference/images/scroll-image.md +1 -2
  45. package/docs/reference/images/show-frame.md +1 -1
  46. package/docs/reference/images/show-image.md +1 -1
  47. package/docs/reference/images/width.md +1 -2
  48. package/docs/reference/pins/set-audio-pin-enabled.md +38 -0
  49. package/docs/reference/pins/set-audio-pin.md +2 -1
  50. package/package.json +3 -3
  51. package/pxtarget.json +2 -1
  52. package/targetconfig.json +3 -37
  53. package/built/hexcache/0b0ef5aa10458cd792db8bb60d6016582a48904c3caf6491fee8c4fed1dcebe1.hex +0 -20347
  54. package/built/hexcache/2e8285fb3e0552598a6cfc14b7f1458b7a93baad71011f78c6f93598c5381e38.hex +0 -19748
package/built/sim.d.ts CHANGED
@@ -322,7 +322,7 @@ declare namespace pxsim.flashlog {
322
322
  Days = 864000
323
323
  }
324
324
  export function beginRow(): number;
325
- export function logData(key: string, value: string, prepend?: boolean): DAL.DEVICE_OK | DAL.DEVICE_INVALID_STATE;
325
+ export function logData(key: string, value: string, prepend?: boolean): DAL.MUTEX | DAL.DEVICE_INVALID_STATE;
326
326
  export function endRow(): number;
327
327
  export function logString(s: string): void;
328
328
  export function clear(fullErase: boolean): void;
@@ -467,7 +467,7 @@ declare namespace pxsim.basic {
467
467
  }
468
468
  declare namespace pxsim.control {
469
469
  var inBackground: typeof thread.runInBackground;
470
- function onEvent(id: number, evid: number, handler: RefAction): void;
470
+ function onEvent(id: number, evid: number, handler: RefAction, flags: number): void;
471
471
  function eventTimestamp(): number;
472
472
  function eventValue(): string | number;
473
473
  }
@@ -570,10 +570,13 @@ declare namespace pxsim {
570
570
  recorder: MediaRecorder;
571
571
  chunks: Blob[];
572
572
  audioURL: string;
573
+ audioURLBitRate: number;
573
574
  recording: HTMLAudioElement;
574
575
  audioPlaying: boolean;
575
576
  recordTimeoutID: any;
576
577
  currentlyErasing: boolean;
578
+ inputBitRate: number;
579
+ outputBitRate: number;
577
580
  handleAudioPlaying: () => void;
578
581
  handleAudioStopped: () => void;
579
582
  initListeners: () => void;
@@ -592,6 +595,7 @@ declare namespace pxsim.record {
592
595
  function setInputSampleRate(sampleRate: number): void;
593
596
  function setOutputSampleRate(sampleRate: number): void;
594
597
  function setBothSamples(sampleRate: number): void;
598
+ function defaultBitRate(): number;
595
599
  }
596
600
  declare namespace pxsim {
597
601
  class SerialState {
@@ -795,6 +799,7 @@ declare namespace pxsim {
795
799
  function isIE(): boolean;
796
800
  function isChrome(): boolean;
797
801
  function isSafari(): boolean;
802
+ function isFirefox(): boolean;
798
803
  }
799
804
  declare namespace pxsim.pxtcore {
800
805
  function registerWithDal(id: number, evid: number, handler: RefAction, mode?: number): void;
package/built/sim.js CHANGED
@@ -1993,7 +1993,7 @@ var pxsim;
1993
1993
  var control;
1994
1994
  (function (control) {
1995
1995
  control.inBackground = pxsim.thread.runInBackground;
1996
- function onEvent(id, evid, handler) {
1996
+ function onEvent(id, evid, handler, flags) {
1997
1997
  if (id == 3 /* DAL.MICROBIT_ID_BUTTON_AB */) {
1998
1998
  const b = pxsim.board().buttonPairState;
1999
1999
  if (!b.usesButtonAB) {
@@ -2001,7 +2001,7 @@ var pxsim;
2001
2001
  pxsim.runtime.queueDisplayUpdate();
2002
2002
  }
2003
2003
  }
2004
- pxsim.pxtcore.registerWithDal(id, evid, handler);
2004
+ pxsim.pxtcore.registerWithDal(id, evid, handler, flags);
2005
2005
  }
2006
2006
  control.onEvent = onEvent;
2007
2007
  function eventTimestamp() {
@@ -2299,6 +2299,8 @@ var pxsim;
2299
2299
  constructor() {
2300
2300
  this.currentlyRecording = false;
2301
2301
  this.audioPlaying = false;
2302
+ this.inputBitRate = pxsim.record.defaultBitRate();
2303
+ this.outputBitRate = pxsim.record.defaultBitRate();
2302
2304
  this.handleAudioPlaying = () => {
2303
2305
  this.audioPlaying = true;
2304
2306
  };
@@ -2318,6 +2320,14 @@ var pxsim;
2318
2320
  (function (pxsim) {
2319
2321
  var record;
2320
2322
  (function (record_1) {
2323
+ // Arbitrarily chosen lower bound. Can't go much lower than this without bugs cropping up
2324
+ const MIN_BIT_RATE = 3000;
2325
+ // This is double the default in chrome (128000)
2326
+ const MAX_BIT_RATE = 256000;
2327
+ const MAX_SAMPLE_RATE = 22000;
2328
+ const MIN_SAMPLE_RATE = 1000;
2329
+ const MIN_RECORDING_TIME = 3000;
2330
+ const MAX_RECORDING_TIME = 20000;
2321
2331
  let _initialized = false;
2322
2332
  function init() {
2323
2333
  if (!_initialized) {
@@ -2326,67 +2336,74 @@ var pxsim;
2326
2336
  }
2327
2337
  }
2328
2338
  function stopRecorder(b) {
2329
- b.recordingState.recorder.stop();
2330
- b.recordingState.currentlyRecording = false;
2339
+ const state = b.recordingState;
2340
+ state.recorder.stop();
2341
+ state.currentlyRecording = false;
2331
2342
  pxsim.runtime.queueDisplayUpdate();
2332
- if (b.recordingState.stream.active) {
2333
- b.recordingState.stream.getAudioTracks().forEach(track => {
2343
+ if (state.stream.active) {
2344
+ for (const track of state.stream.getAudioTracks()) {
2334
2345
  track.stop();
2335
2346
  track.enabled = false;
2336
- });
2347
+ }
2337
2348
  }
2338
2349
  }
2339
2350
  async function populateRecording(b) {
2340
- if (b.recordingState.currentlyErasing) {
2351
+ const state = b.recordingState;
2352
+ if (state.currentlyErasing) {
2341
2353
  await erasingAsync(b);
2342
2354
  }
2343
- if (b.recordingState.chunks[0].size > 0) {
2344
- b.recordingState.audioURL = null;
2355
+ if (state.chunks[0].size > 0) {
2356
+ state.audioURL = null;
2345
2357
  const recordingType = pxsim.isSafari() ? "audio/mp4" : "audio/ogg; codecs=opus";
2346
- const blob = new Blob(b.recordingState.chunks, { type: recordingType });
2347
- b.recordingState.audioURL = window.URL.createObjectURL(blob);
2348
- b.recordingState.recording = new Audio(b.recordingState.audioURL);
2349
- b.recordingState.initListeners();
2358
+ const blob = new Blob(state.chunks, { type: recordingType });
2359
+ state.audioURL = window.URL.createObjectURL(blob);
2360
+ state.recording = new Audio(state.audioURL);
2361
+ state.initListeners();
2350
2362
  }
2351
- b.recordingState.currentlyRecording = false;
2352
- b.recordingState.recorder = null;
2353
- b.recordingState.chunks = [];
2363
+ state.currentlyRecording = false;
2364
+ state.recorder = null;
2365
+ state.chunks = [];
2354
2366
  }
2355
2367
  async function record() {
2368
+ var _a;
2356
2369
  let b = pxsim.board();
2357
2370
  init();
2358
- if (b.recordingState.recorder) {
2359
- b.recordingState.recorder.stop();
2360
- clearTimeout(b.recordingState.recordTimeoutID);
2371
+ const state = b.recordingState;
2372
+ if (state.recorder) {
2373
+ state.recorder.stop();
2374
+ clearTimeout(state.recordTimeoutID);
2361
2375
  }
2362
- if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
2376
+ if ((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {
2363
2377
  try {
2364
- b.recordingState.stream = await navigator.mediaDevices.getUserMedia({ video: false, audio: true });
2365
- b.recordingState.recorder = new MediaRecorder(b.recordingState.stream);
2366
- b.recordingState.recorder.start();
2367
- b.recordingState.currentlyRecording = true;
2378
+ state.stream = await navigator.mediaDevices.getUserMedia({ video: false, audio: true });
2379
+ state.recorder = new MediaRecorder(state.stream, { audioBitsPerSecond: state.inputBitRate });
2380
+ state.recorder.start();
2381
+ state.currentlyRecording = true;
2368
2382
  pxsim.runtime.queueDisplayUpdate();
2369
- b.recordingState.recordTimeoutID = setTimeout(() => {
2383
+ const recordBitRate = state.inputBitRate;
2384
+ const duration = (1 - ((recordBitRate - MIN_BIT_RATE) / (MAX_BIT_RATE - MIN_BIT_RATE))) * (MAX_RECORDING_TIME - MIN_RECORDING_TIME) + MIN_RECORDING_TIME;
2385
+ state.recordTimeoutID = setTimeout(() => {
2370
2386
  stopRecorder(b);
2371
- }, 5000);
2372
- b.recordingState.recorder.ondataavailable = (e) => {
2373
- b.recordingState.chunks.push(e.data);
2387
+ }, duration);
2388
+ state.recorder.ondataavailable = (e) => {
2389
+ state.chunks.push(e.data);
2374
2390
  };
2375
- b.recordingState.recorder.onstop = async () => {
2391
+ state.recorder.onstop = async () => {
2376
2392
  await populateRecording(b);
2393
+ state.audioURLBitRate = recordBitRate;
2377
2394
  };
2378
2395
  }
2379
2396
  catch (error) {
2380
2397
  console.log("An error occurred, could not get microphone access");
2381
- if (b.recordingState.recorder) {
2382
- b.recordingState.recorder.stop();
2398
+ if (state.recorder) {
2399
+ state.recorder.stop();
2383
2400
  }
2384
- b.recordingState.currentlyRecording = false;
2401
+ state.currentlyRecording = false;
2385
2402
  }
2386
2403
  }
2387
2404
  else {
2388
2405
  console.log("getUserMedia not supported on your browser!");
2389
- b.recordingState.currentlyRecording = false;
2406
+ state.currentlyRecording = false;
2390
2407
  }
2391
2408
  }
2392
2409
  record_1.record = record;
@@ -2421,13 +2438,24 @@ var pxsim;
2421
2438
  return;
2422
2439
  init();
2423
2440
  stopAudio();
2424
- b.recordingState.audioPlaying = true;
2441
+ const state = b.recordingState;
2442
+ state.audioPlaying = true;
2425
2443
  setTimeout(async () => {
2426
- if (!b.recordingState.currentlyErasing && b.recordingState.recording) {
2444
+ if (!state.currentlyErasing && state.recording) {
2427
2445
  try {
2428
2446
  const volume = pxsim.AudioContextManager.isMuted() ? 0 : 1;
2429
- b.recordingState.recording.volume = volume;
2430
- await b.recordingState.recording.play();
2447
+ state.recording.volume = volume;
2448
+ const minPlaybackRate = 0.15;
2449
+ // 15 is the maximum playback rate that still produced sound in Chrome on Windows.
2450
+ // In Firefox, it seems like 8 is the max. Higher numbers silently fail.
2451
+ let maxPlaybackRate = 15;
2452
+ if (pxsim.isFirefox()) {
2453
+ maxPlaybackRate = 8;
2454
+ }
2455
+ const playbackRate = Math.max(minPlaybackRate, Math.min(maxPlaybackRate, bitRateToSampleRate(state.outputBitRate) / bitRateToSampleRate(state.audioURLBitRate)));
2456
+ state.recording.playbackRate = playbackRate;
2457
+ state.recording.preservesPitch = false;
2458
+ await state.recording.play();
2431
2459
  }
2432
2460
  catch (e) {
2433
2461
  if (!(e instanceof DOMException)) {
@@ -2436,7 +2464,7 @@ var pxsim;
2436
2464
  }
2437
2465
  }
2438
2466
  else {
2439
- b.recordingState.audioPlaying = false;
2467
+ state.audioPlaying = false;
2440
2468
  }
2441
2469
  }, 10);
2442
2470
  }
@@ -2507,14 +2535,43 @@ var pxsim;
2507
2535
  }
2508
2536
  record_1.audioIsStopped = audioIsStopped;
2509
2537
  function setInputSampleRate(sampleRate) {
2538
+ const b = pxsim.board();
2539
+ if (!b)
2540
+ return;
2541
+ b.recordingState.inputBitRate = sampleRateToBitRate(sampleRate);
2510
2542
  }
2511
2543
  record_1.setInputSampleRate = setInputSampleRate;
2512
2544
  function setOutputSampleRate(sampleRate) {
2545
+ const b = pxsim.board();
2546
+ if (!b)
2547
+ return;
2548
+ b.recordingState.outputBitRate = sampleRateToBitRate(sampleRate);
2513
2549
  }
2514
2550
  record_1.setOutputSampleRate = setOutputSampleRate;
2515
2551
  function setBothSamples(sampleRate) {
2552
+ setInputSampleRate(sampleRate);
2553
+ setOutputSampleRate(sampleRate);
2516
2554
  }
2517
2555
  record_1.setBothSamples = setBothSamples;
2556
+ /**
2557
+ * The browser API doesn't allow us to control sample rate directly, but we
2558
+ * can affect it by setting the bit rate. This maps the supported sample rates
2559
+ * into a reasonable range of bit rates.
2560
+ */
2561
+ function sampleRateToBitRate(sampleRate) {
2562
+ return mapRange(sampleRate, MIN_SAMPLE_RATE, MAX_SAMPLE_RATE, MIN_BIT_RATE, MAX_BIT_RATE);
2563
+ }
2564
+ function bitRateToSampleRate(bitRate) {
2565
+ return mapRange(bitRate, MIN_BIT_RATE, MAX_BIT_RATE, MIN_SAMPLE_RATE, MAX_SAMPLE_RATE);
2566
+ }
2567
+ function mapRange(value, inMin, inMax, outMin, outMax) {
2568
+ value = Math.min(Math.max(inMin, value), inMax);
2569
+ return ((value - inMin) / (inMax - inMin)) * (outMax - outMin) + outMin;
2570
+ }
2571
+ function defaultBitRate() {
2572
+ return sampleRateToBitRate(11000);
2573
+ }
2574
+ record_1.defaultBitRate = defaultBitRate;
2518
2575
  })(record = pxsim.record || (pxsim.record = {}));
2519
2576
  })(pxsim || (pxsim = {}));
2520
2577
  var pxsim;
@@ -4216,6 +4273,11 @@ var pxsim;
4216
4273
  return !isChrome() && !isEdge() && !!navigator && /(Macintosh|Safari|iPod|iPhone|iPad)/i.test(navigator.userAgent);
4217
4274
  }
4218
4275
  pxsim.isSafari = isSafari;
4276
+ //Safari and WebKit lie about being Firefox
4277
+ function isFirefox() {
4278
+ return !isSafari() && !!navigator && (/Firefox/i.test(navigator.userAgent) || /Seamonkey/i.test(navigator.userAgent));
4279
+ }
4280
+ pxsim.isFirefox = isFirefox;
4219
4281
  })(pxsim || (pxsim = {}));
4220
4282
  var pxsim;
4221
4283
  (function (pxsim) {
@@ -4223,7 +4285,7 @@ var pxsim;
4223
4285
  (function (pxtcore) {
4224
4286
  // TODO: add in support for mode, as in CODAL
4225
4287
  function registerWithDal(id, evid, handler, mode = 0) {
4226
- pxsim.board().bus.listen(id, evid, handler);
4288
+ pxsim.board().bus.listen(id, evid, handler, mode);
4227
4289
  }
4228
4290
  pxtcore.registerWithDal = registerWithDal;
4229
4291
  function deepSleep() {
@@ -1 +1 @@
1
- {"A Blocks / JavaScript code editor for the micro:bit powered by Microsoft MakeCode.":"A Blocks / JavaScript code editor for the micro:bit powered by Microsoft MakeCode.","A micro-servo library":"A micro-servo library","Adds new blocks for message communication in the radio category":"Adds new blocks for message communication in the radio category","BETA - Camera, remote control and other Bluetooth services. App required.":"BETA - Camera, remote control and other Bluetooth services. App required.","Behind the MakeCode Hardware":"Behind the MakeCode Hardware","Blocks to JavaScript":"Blocks to JavaScript","Bluetooth services":"Bluetooth services","Buy":"Buy","Can't import microbit.co.uk scripts...":"Can't import microbit.co.uk scripts...","Coding Cards":"Coding Cards","Coding for Teachers":"Coding for Teachers","Color manipulation":"Color manipulation","Courses":"Courses","Data logging to flash memory. micro:bit (V2) only.":"Data logging to flash memory. micro:bit (V2) only.","Data logging to flash.":"Data logging to flash.","Deep Dive":"Deep Dive","Disable Bluetooth Event Service":"Disable Bluetooth Event Service","Download cancelled":"Download cancelled","Download failed, please try again":"Download failed, please try again","Download for V2 only":"Download for V2 only","Fashion":"Fashion","Games":"Games","Go Back":"Go Back","Go to the old editor":"Go to the old editor","Great coding skills! Unfortunately, your program is too large to fit on a micro:bit V1😢. You can go back and try to make your program smaller, or you can download your program onto a micro:bit V2.":"Great coding skills! Unfortunately, your program is too large to fit on a micro:bit V1😢. You can go back and try to make your program smaller, or you can download your program onto a micro:bit V2.","Hardware":"Hardware","Importing microbit.co.uk programs is not supported in this editor anymore. Please open this script in the https://makecode.microbit.org/v0 editor.":"Importing microbit.co.uk programs is not supported in this editor anymore. Please open this script in the https://makecode.microbit.org/v0 editor.","Jacdac":"Jacdac","JustWorks pairing (default): Pairing is automatic once the pairing is initiated.":"JustWorks pairing (default): Pairing is automatic once the pairing is initiated.","Live Coding":"Live Coding","MicroCode for the new micro:bit (V2)":"MicroCode for the new micro:bit (V2)","Microsoft MakeCode for micro:bit":"Microsoft MakeCode for micro:bit","Music":"Music","New? Start here!":"New? Start here!","No Pairing Required: Anyone can connect via Bluetooth.":"No Pairing Required: Anyone can connect via Bluetooth.","Oops, there was a problem downloading your code":"Oops, there was a problem downloading your code","Passkey pairing: Pairing requires 6 digit key to pair.":"Passkey pairing: Pairing requires 6 digit key to pair.","Radio Games":"Radio Games","Record sound clips. micro:bit (V2) only":"Record sound clips. micro:bit (V2) only","Reference":"Reference","Science":"Science","Science Experiments":"Science Experiments","Settings storage in internal flash":"Settings storage in internal flash","Support":"Support","The microbit core library":"The microbit core library","The microphone library":"The microphone library","The radio services":"The radio services","Tools":"Tools","Toys":"Toys","Turtle":"Turtle","Tutorials":"Tutorials","Tutorials for the new micro:bit (V2)":"Tutorials for the new micro:bit (V2)","makecode.microbit.org":"makecode.microbit.org","{id:extension-tag}Gaming":"Gaming","{id:extension-tag}Lights and Display":"Lights and Display","{id:extension-tag}Networking":"Networking","{id:extension-tag}Robotics":"Robotics","{id:extension-tag}Science":"Science","{id:extension-tag}Software":"Software","{id:type}Image":"Image","{id:type}LedSprite":"LedSprite","{id:var}image":"image","{id:var}sprite":"sprite"}
1
+ {"A Blocks / JavaScript code editor for the micro:bit powered by Microsoft MakeCode.":"A Blocks / JavaScript code editor for the micro:bit powered by Microsoft MakeCode.","A micro-servo library":"A micro-servo library","Adds new blocks for message communication in the radio category":"Adds new blocks for message communication in the radio category","BETA - Camera, remote control and other Bluetooth services. App required.":"BETA - Camera, remote control and other Bluetooth services. App required.","Behind the MakeCode Hardware":"Behind the MakeCode Hardware","Blocks to JavaScript":"Blocks to JavaScript","Bluetooth services":"Bluetooth services","Buy":"Buy","Can't import microbit.co.uk scripts...":"Can't import microbit.co.uk scripts...","Coding Cards":"Coding Cards","Coding for Teachers":"Coding for Teachers","Color manipulation":"Color manipulation","Courses":"Courses","Data logging to flash memory. micro:bit (V2) only.":"Data logging to flash memory. micro:bit (V2) only.","Data logging to flash.":"Data logging to flash.","Deep Dive":"Deep Dive","Disable Bluetooth Event Service":"Disable Bluetooth Event Service","Download cancelled":"Download cancelled","Download failed, please try again":"Download failed, please try again","Download for V2 only":"Download for V2 only","Fashion":"Fashion","Fonts for displays (V2 only).":"Fonts for displays (V2 only).","Games":"Games","Go Back":"Go Back","Go to the old editor":"Go to the old editor","Great coding skills! Unfortunately, your program is too large to fit on a micro:bit V1😢. You can go back and try to make your program smaller, or you can download your program onto a micro:bit V2.":"Great coding skills! Unfortunately, your program is too large to fit on a micro:bit V1😢. You can go back and try to make your program smaller, or you can download your program onto a micro:bit V2.","Hardware":"Hardware","Importing microbit.co.uk programs is not supported in this editor anymore. Please open this script in the https://makecode.microbit.org/v0 editor.":"Importing microbit.co.uk programs is not supported in this editor anymore. Please open this script in the https://makecode.microbit.org/v0 editor.","Jacdac":"Jacdac","JustWorks pairing (default): Pairing is automatic once the pairing is initiated.":"JustWorks pairing (default): Pairing is automatic once the pairing is initiated.","Live Coding":"Live Coding","MicroCode for the new micro:bit (V2)":"MicroCode for the new micro:bit (V2)","Microsoft MakeCode for micro:bit":"Microsoft MakeCode for micro:bit","Music":"Music","New? Start here!":"New? Start here!","No Pairing Required: Anyone can connect via Bluetooth.":"No Pairing Required: Anyone can connect via Bluetooth.","Oops, there was a problem downloading your code":"Oops, there was a problem downloading your code","Passkey pairing: Pairing requires 6 digit key to pair.":"Passkey pairing: Pairing requires 6 digit key to pair.","Radio Games":"Radio Games","Record sound clips. micro:bit (V2) only":"Record sound clips. micro:bit (V2) only","Reference":"Reference","Science":"Science","Science Experiments":"Science Experiments","Settings storage in internal flash":"Settings storage in internal flash","Support":"Support","The microbit core library":"The microbit core library","The microphone library":"The microphone library","The radio services":"The radio services","Tools":"Tools","Toys":"Toys","Turtle":"Turtle","Tutorials":"Tutorials","Tutorials for the new micro:bit (V2)":"Tutorials for the new micro:bit (V2)","makecode.microbit.org":"makecode.microbit.org","{id:extension-tag}Gaming":"Gaming","{id:extension-tag}Lights and Display":"Lights and Display","{id:extension-tag}Networking":"Networking","{id:extension-tag}Robotics":"Robotics","{id:extension-tag}Science":"Science","{id:extension-tag}Software":"Software","{id:type}Image":"Image","{id:type}LedSprite":"LedSprite","{id:var}image":"image","{id:var}sprite":"sprite"}