<reponame>voltur01/remotebit<filename>remotebit/music.py
# SPDX-License-Identifier: MIT
# Copyright (c) 2021 <NAME>

# remote:bit is a remote Python execution library for BBC micro:bit
# https://github.com/voltur01/remotebit

from microbit import *

def set_tempo(ticks: int = 4, bpm: int = 120) -> None:
    get_mb_link().send(f'music.set_tempo {ticks} {bpm}')

def get_tempo() -> int:
    ticks_bmp = get_mb_link().send_receive('music.get_tempo').split()
    return int(ticks_bmp[0]), int(ticks_bmp[1])

def play(music, pin: Pin = pin0, wait: bool = True, loop: bool = False) -> None:
    if not(isinstance(music, str)):
        music = ' '.join(music)
    get_mb_link().send(f'music.play {mb_escape(music)} {mb_pin_num(pin)} {wait} {loop}')

def pitch(frequency:int, duration: int = -1, pin: Pin = pin0, wait: bool = True) -> None:
    get_mb_link().send(f'music.pitch {frequency} {duration} {mb_pin_num(pin)} {wait}')

def stop(pin: Pin = pin0) -> None:
    get_mb_link().send(f'music.stop {mb_pin_num(pin)}')

def reset() -> None:
    get_mb_link().send('music.reset')

# These are the default melodies as provided by MicroPython, 
# refer to the MicroPython docs for the details and copyrights
DADADADUM = 'r4:2 g g g eb:8 r:2 f f f d:8'.split()

ENTERTAINER = 'd4:1 d# e c5:2 e4:1 c5:2 e4:1 c5:3 c:1 d d# e c d e:2 b4:1 d5:2 c:4'.split()

PRELUDE = 'c4:1 e g c5 e g4 c5 e c4 e g c5 e g4 c5 e c4 d g d5 f'\
    'g4 d5 f c4 d g d5 f g4 d5 f b3 d4 g d5 f g4 d5 f b3 d4 g'\
    'd5 f g4 d5 f c4 e g c5 e g4 c5 e c4 e g c5 e g4 c5 e'.split()

ODE = 'e4 e f g g f e d c c d e e:6 d:2 d:8 e:4 e f g g f e d c c d e d:6 c:2 c:8'.split()

NYAN = 'f#5:2 g# c#:1 d#:2 b4:1 d5:1 c# b4:2 b c#5 d d:1 c# b4:1 c#5:1 d# f# g# d#'\
    'f# c# d b4 c#5 b4 d#5:2 f# g#:1 d# f# c# d# b4 d5 d# d c# b4 c#5 d:2 b4:1 c#5'\
    'd# f# c# d c# b4 c#5:2 b4 c#5 b4 f#:1 g# b:2 f#:1 g# b c#5 d# b4 e5 d# e f#'\
    'b4:2 b f#:1 g# b f# e5 d# c# b4 f# d# e f# b:2 f#:1 g# b:2 f#:1 g# b b c#5 d#'\
    'b4 f# g# f# b:2 b:1 a# b f# g# b e5 d# e f# b4:2 c#5'.split()

RINGTONE = 'c4:1 d e:2 g d:1 e f:2 a e:1 f g:2 b c5:4'.split()

FUNK = 'c2:2 c d# c:1 f:2 c:1 f:2 f# g c c g c:1 f#:2 c:1 f#:2 f d#'.split()

BLUES = 'c2:2 e g a a# a g e c2:2 e g a a# a g e f a c3 d d# d c a2 c2:2 e g'\
    'a a# a g e g b d3 f f2 a c3 d# c2:2 e g e g f e d'.split()

BIRTHDAY = 'c4:3 c:1 d:4 c:4 f e:8 c:3 c:1 d:4 c:4 g f:8 c:3 c:1 c5:4 a4'\
    'f e d a#:3 a#:1 a:4 f g f:8'.split()

WEDDING = 'c4:4 f:3 f:1 f:8 c:4 g:3 e:1 f:8 c:4 f:3 a:1 c5:4 a4:3 f:1 f:4 e:3 f:1 g:8'.split()

FUNERAL = 'c3:4 c:3 c:1 c:4 d#:3 d:1 d:3 c:1 c:3 b2:1 c3:4'.split()

PUNCHLINE = 'c4:3 g3:1 f# g g#:3 g r b c4'.split()

PYTHON = 'd5:1 b4 r b b a# b g5 r d d r b4 c5 r c c r d e:5 c:1 a4 r a a g# a'\
    'f#5 r e e r c b4 r b b r c5 d:5 d:1 b4 r b b a# b b5 r g g r d c# r a a'\
    'r a a:5 g:1 f#:2 a:1 a g# a e:2 a:1 a g# a d r c# d r c# d:2 r:3'.split()

BADDY = 'c3:3 r d:2 d# r c r f#:8'.split()

CHASE = 'a4:1 b c5 b4 a:2 r a:1 b c5 b4 a:2 r a:2 e5 d# e f e d# e b4:1'\
    'c5 d c b4:2 r b:1 c5 d c b4:2 r b:2 e5 d# e f e d# e'.split()

BA_DING = 'b5:1 e6:3'.split()

WAWAWAWAA = 'e3:3 r:1 d#:3 r:1 d:4 r:1 c#:8'.split()

JUMP_UP = 'c5:1 d e f g'.split()

JUMP_DOWN = 'g5:1 f e d c'.split()

POWER_UP = 'g4:1 c5 e g:2 e:1 g:3'.split()

POWER_DOWN = 'g5:1 d# c g4:2 b:1 c5:3'.split()
