names = 'CDEFGAB'
solfege = ['Do', 'Re', 'Mi', 'Fa', 'So', 'La', 'Ti']
solfege_intervals = [0, 2, 4, 5, 7, 9, 11]
offsets = {
'bb': -2,
'b': -1,
'': 0,
'#': 1,
'x': 2,
}
def note(scale, position):
note_name = names[(names.index(scale[0]) + solfege.index(position)) % len(names)]
tonic = dict(zip(names, solfege_intervals))[scale[0]] + offsets[scale[1:]]
semitones = (tonic + dict(zip(solfege, solfege_intervals))[position]) % 12
accidental = semitones - dict(zip(names, solfege_intervals))[note_name]
return note_name + {v: k for k, v in offsets.items()}[accidental]
if __name__ == '__main__':
print(note('C', 'Do')) # C
print(note('C', 'Re')) # D
print(note('C', 'Mi')) # E
print(note('D', 'Mi')) # F#
print(note('Bb', 'Fa')) # Eb
print(note('A#', 'Fa')) # D#
print(note('A#', 'Mi')) # Cx (C##)
print(note('Fb', 'Fa')) # Bbb
bmFtZXMgPSAnQ0RFRkdBQicKc29sZmVnZSA9IFsnRG8nLCAnUmUnLCAnTWknLCAnRmEnLCAnU28nLCAnTGEnLCAnVGknXQpzb2xmZWdlX2ludGVydmFscyA9IFswLCAyLCA0LCA1LCA3LCA5LCAxMV0Kb2Zmc2V0cyA9IHsKICAgICdiYic6IC0yLAogICAgJ2InOiAtMSwKICAgICcnOiAwLAogICAgJyMnOiAxLAogICAgJ3gnOiAyLAp9CgpkZWYgbm90ZShzY2FsZSwgcG9zaXRpb24pOgogICAgbm90ZV9uYW1lID0gbmFtZXNbKG5hbWVzLmluZGV4KHNjYWxlWzBdKSArIHNvbGZlZ2UuaW5kZXgocG9zaXRpb24pKSAlIGxlbihuYW1lcyldCiAgICB0b25pYyA9IGRpY3QoemlwKG5hbWVzLCBzb2xmZWdlX2ludGVydmFscykpW3NjYWxlWzBdXSArIG9mZnNldHNbc2NhbGVbMTpdXQogICAgc2VtaXRvbmVzID0gKHRvbmljICsgZGljdCh6aXAoc29sZmVnZSwgc29sZmVnZV9pbnRlcnZhbHMpKVtwb3NpdGlvbl0pICUgMTIKICAgIGFjY2lkZW50YWwgPSBzZW1pdG9uZXMgLSBkaWN0KHppcChuYW1lcywgc29sZmVnZV9pbnRlcnZhbHMpKVtub3RlX25hbWVdCiAgICByZXR1cm4gbm90ZV9uYW1lICsge3Y6IGsgZm9yIGssIHYgaW4gb2Zmc2V0cy5pdGVtcygpfVthY2NpZGVudGFsXQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHByaW50KG5vdGUoJ0MnLCAnRG8nKSkgICMgQwogICAgcHJpbnQobm90ZSgnQycsICdSZScpKSAgIyBECiAgICBwcmludChub3RlKCdDJywgJ01pJykpICAjIEUKICAgIHByaW50KG5vdGUoJ0QnLCAnTWknKSkgICMgRiMKICAgIHByaW50KG5vdGUoJ0JiJywgJ0ZhJykpICAjIEViCiAgICBwcmludChub3RlKCdBIycsICdGYScpKSAgIyBEIwogICAgcHJpbnQobm90ZSgnQSMnLCAnTWknKSkgICMgQ3ggKEMjIykKICAgIHByaW50KG5vdGUoJ0ZiJywgJ0ZhJykpICAjIEJiYg==