def show(self, obj, fmt, app=None, subformats=None, **keywords): ''' show using the appropriate subformat. ''' if subformats is None: subformats = ['vexflow'] if subformats and subformats[0] == 'vexflow': return self.vfshow(obj) #subformats = ['lilypond','png'] if subformats: helperFormat = subformats[0] helperSubformats = subformats[1:] else: helperFormat = "musicxml" helperSubformats = [] if not helperSubformats: helperSubformats = ['png'] from music21 import converter helperConverter = converter.Converter() helperConverter.setSubconverterFromFormat(helperFormat) helperSubConverter = helperConverter.subConverter if helperFormat in ('musicxml', 'xml', 'lilypond', 'lily'): ### hack to make musescore excerpts -- fix with a converter class in MusicXML savedDefaultTitle = defaults.title savedDefaultAuthor = defaults.author defaults.title = '' defaults.author = '' if 'Opus' not in obj.classes: fp = helperSubConverter.write(obj, helperFormat, subformats=helperSubformats) defaults.title = savedDefaultTitle defaults.author = savedDefaultAuthor if helperSubformats[0] == 'png': from music21.ipython21 import objects as ipythonObjects ipo = ipythonObjects.IPythonPNGObject(fp) return ipo else: from IPython.display import Image, display # @UnresolvedImport for s in obj.scores: fp = helperSubConverter.write(s, helperFormat, subformats=helperSubformats) if helperSubformats[0] == 'png': from music21.ipython21 import objects as ipythonObjects # @Reimport ipo = ipythonObjects.IPythonPNGObject(fp) display(Image(filename=ipo.fp, retina=True)) defaults.title = savedDefaultTitle defaults.author = savedDefaultAuthor return None elif helperFormat == 'midi': import base64 from IPython.display import HTML, display # @UnresolvedImport @Reimport fp = helperSubConverter.write(obj, helperFormat, subformats=helperSubformats) with open(fp, 'rb') as f: binaryMidiData = f.read() binaryBase64 = base64.b64encode(binaryMidiData) s = common.SingletonCounter() outputId = "midiPlayerDiv" + str(s()) display( HTML(""" <div id='""" + outputId + """'></div> <link rel="stylesheet" href="http://artusi.xyz/music21j/css/m21.css" type="text/css" /> <script> require.config({ paths: {'music21': 'http://artusi.xyz/music21j/src/music21'} }); require(['music21'], function() { mp = new music21.miditools.MidiPlayer(); mp.addPlayer('#""" + outputId + """'); mp.base64Load('data:audio/midi;base64,""" + binaryBase64.decode('utf-8') + """'); }); </script>"""))
if WEAKREF_ACTIVE and self.siteWeakref is not None: siteIdValue = self.siteWeakref try: currentSite = GLOBAL_SITE_STATE_DICT[siteIdValue] del GLOBAL_SITE_STATE_DICT[siteIdValue] except KeyError: currentSite = None self.isDead = True self.site = currentSite _NoneSiteRef = SiteRef() _NoneSiteRef.globalSiteIndex = -2 # -1 is used elsewhere... _NoneSiteRef.siteIndex = -2 _singletonCounter = common.SingletonCounter() class Sites(common.SlottedObjectMixin): ''' An object, stored within a Music21Object, that stores (weak) references to a collection of objects that may be contextually relevant to this object. Most of these objects are locations (also called sites), or Streams that contain this object. All defined contexts are stored as dictionaries in a dictionary. The outermost dictionary stores objects. ''' ### CLASS VARIABLES ###
def show(self, obj, fmt, app=None, subformats=None, **keywords): # pragma: no cover ''' show using the appropriate subformat. ''' if subformats is None: subformats = ['vexflow'] if subformats and subformats[0] == 'vexflow': return self.vfshow(obj) #subformats = ['lilypond', 'png'] if subformats: helperFormat = subformats[0] helperSubformats = subformats[1:] else: helperFormat = "musicxml" helperSubformats = [] if not helperSubformats: helperSubformats = ['png'] from music21 import converter helperConverter = converter.Converter() helperConverter.setSubconverterFromFormat(helperFormat) helperSubConverter = helperConverter.subConverter from IPython.display import Image, display, HTML # @UnresolvedImport if helperFormat in ('musicxml', 'xml', 'lilypond', 'lily'): ### hack to make musescore excerpts -- fix with a converter class in MusicXML from music21.ipython21 import objects as ipythonObjects savedDefaultTitle = defaults.title savedDefaultAuthor = defaults.author defaults.title = '' defaults.author = '' if 'Opus' not in obj.classes: scores = [obj] else: scores = list(obj.scores) for s in scores: fp = helperSubConverter.write(s, helperFormat, subformats=helperSubformats, **keywords) if helperSubformats[0] == 'png': if not str(environLocal['musescoreDirectPNGPath']).startswith('/skip'): ipo = ipythonObjects.IPythonPNGObject(fp) display(Image(data=ipo.getData(), retina=True)) else: # smallest transparent pixel pngData64 = (b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA' + b'6fptVAAAACklEQVQYV2P4DwABAQEAWk1v8QAAAABJRU5ErkJggg==') pngData = base64.b64decode(pngData64) display(Image(data=pngData, retina=True)) defaults.title = savedDefaultTitle defaults.author = savedDefaultAuthor return None elif helperFormat == 'midi': fp = helperSubConverter.write(obj, helperFormat, subformats=helperSubformats) with open(fp, 'rb') as f: binaryMidiData = f.read() binaryBase64 = base64.b64encode(binaryMidiData) s = common.SingletonCounter() outputId = "midiPlayerDiv" + str(s()) display(HTML(""" <div id='""" + outputId + """'></div> <link rel="stylesheet" href="http://artusi.xyz/music21j/css/m21.css" type="text/css" /> <script> require.config({ paths: {'music21': 'http://artusi.xyz/music21j/src/music21'} }); require(['music21'], function() { mp = new music21.miditools.MidiPlayer(); mp.addPlayer('#""" + outputId + """'); mp.base64Load('data:audio/midi;base64,""" + binaryBase64.decode('utf-8') + """'); }); </script>"""))