From 24f5b43285602e6a403d4e172ce83176a5085516 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Tue, 29 Sep 2015 21:48:07 -0400 Subject: [PATCH] 2.0.0 beta initial commit --- gulpfile.js | 58 + lib/libmei.plg | 2084 +++++++++++++++++++++++++++++++++ package.json | 20 + plgconfig.js | 14 + sibs/accidentals.sib | Bin 0 -> 38808 bytes sibs/beams.sib | Bin 0 -> 38815 bytes sibs/header.sib | Bin 0 -> 30801 bytes sibs/staves.sib | Bin 0 -> 47572 bytes src/ExportConverters.mss | 964 +++++++++++++++ src/ExportGenerators.mss | 1097 +++++++++++++++++ src/ExportProcessors.mss | 453 +++++++ src/GLOBALS.mss | 18 + src/Initialize.mss | 8 + src/Run.mss | 65 + src/Utilities.mss | 241 ++++ test/GLOBALS.mss | 1 + test/Initialize.mss | Bin 0 -> 78 bytes test/Run.mss | Bin 0 -> 1612 bytes test/TestExportConverters.mss | 323 +++++ test/TestExportGenerators.mss | 262 +++++ test/TestExportProcessors.mss | 4 + test/TestLibmei.mss | 201 ++++ test/TestUtilities.mss | 27 + 23 files changed, 5840 insertions(+) create mode 100644 gulpfile.js create mode 100644 lib/libmei.plg create mode 100644 package.json create mode 100644 plgconfig.js create mode 100644 sibs/accidentals.sib create mode 100644 sibs/beams.sib create mode 100644 sibs/header.sib create mode 100644 sibs/staves.sib create mode 100644 src/ExportConverters.mss create mode 100644 src/ExportGenerators.mss create mode 100644 src/ExportProcessors.mss create mode 100644 src/GLOBALS.mss create mode 100644 src/Initialize.mss create mode 100644 src/Run.mss create mode 100644 src/Utilities.mss create mode 100644 test/GLOBALS.mss create mode 100644 test/Initialize.mss create mode 100644 test/Run.mss create mode 100644 test/TestExportConverters.mss create mode 100644 test/TestExportGenerators.mss create mode 100644 test/TestExportProcessors.mss create mode 100644 test/TestLibmei.mss create mode 100644 test/TestUtilities.mss diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..104d5ff --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,58 @@ +/* jshint node:true */ +'use strict' + +var gulp = require('gulp'); +var child = require('child_process'); +var gutil = require('gulp-util'); +var Q = require('q'); + +gulp.task('develop:build', function(callback) +{ + var deferred = Q.defer(); + gutil.log(gutil.colors.blue('Copying "linked" libraries')); + gulp.src('lib/*.plg') + .pipe(gulp.dest('build/')); + + var build = child.exec('buildPlg', function(err, stdout, stderr) + { + if (err) + { + gutil.log(gutil.colors.red("Build failed with error code: " + err.code)); + } + gutil.log(gutil.colors.blue('Output: ') + '\n' + stdout); + }); + + var buildTest = child.exec('buildPlg test', function(err, stdout, stderr) + { + if (err) + { + gutil.log(gutil.colors.red("Test Build failed with error code: " + err.code)); + } + gutil.log(gutil.colors.blue('Output: ') + '\n' + stdout); + deferred.resolve(); + }); + + return deferred.promise; +}); + +gulp.task('develop:deploy', ['develop:build'], function() +{ + var deploy = child.exec('deployPlg', function(err, stdout, stderr) + { + if (err) + { + gutil.log(gutil.colors.red("Deploy failed with error code: " + err.code)); + } + gutil.log(gutil.colors.blue('Output: ') + '\n' + stdout); + }); +}); + +gulp.task('develop', function() +{ + gulp.watch(['src/**/*', 'test/**/*', 'lib/**/*.plg'], ['develop:build', 'develop:deploy']) +}); + +gulp.task('default', function() +{ + gulp.start('develop') +}); \ No newline at end of file diff --git a/lib/libmei.plg b/lib/libmei.plg new file mode 100644 index 0000000..f578917 --- /dev/null +++ b/lib/libmei.plg @@ -0,0 +1,2084 @@ + +{ + + _License "() { + return 'Copyright (c) 2011-2015 Andrew Hankinson, Alastair Porter, and Others + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + Software), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.'; + }" + + +Arpeg "() { + CreateElement('arpeg', null); +}" + +BTrem "() { + CreateElement('bTrem', null); +}" + +Beam "() { + CreateElement('beam', null); +}" + +BeamSpan "() { + CreateElement('beamSpan', null); +}" + +BeatRpt "() { + CreateElement('beatRpt', null); +}" + +Bend "() { + CreateElement('bend', null); +}" + +Breath "() { + CreateElement('breath', null); +}" + +FTrem "() { + CreateElement('fTrem', null); +}" + +Fermata "() { + CreateElement('fermata', null); +}" + +Gliss "() { + CreateElement('gliss', null); +}" + +Hairpin "() { + CreateElement('hairpin', null); +}" + +HalfmRpt "() { + CreateElement('halfmRpt', null); +}" + +HarpPedal "() { + CreateElement('harpPedal', null); +}" + +MRest "() { + CreateElement('mRest', null); +}" + +MRpt "() { + CreateElement('mRpt', null); +}" + +MRpt2 "() { + CreateElement('mRpt2', null); +}" + +MSpace "() { + CreateElement('mSpace', null); +}" + +Measure "() { + CreateElement('measure', null); +}" + +MeterSig "() { + CreateElement('meterSig', null); +}" + +MeterSigGrp "() { + CreateElement('meterSigGrp', null); +}" + +MultiRest "() { + CreateElement('multiRest', null); +}" + +MultiRpt "() { + CreateElement('multiRpt', null); +}" + +Octave "() { + CreateElement('octave', null); +}" + +Ossia "() { + CreateElement('ossia', null); +}" + +Pedal "() { + CreateElement('pedal', null); +}" + +Reh "() { + CreateElement('reh', null); +}" + +Slur "() { + CreateElement('slur', null); +}" + +Tie "() { + CreateElement('tie', null); +}" + +Tuplet "() { + CreateElement('tuplet', null); +}" + +TupletSpan "() { + CreateElement('tupletSpan', null); +}" + +Mordent "() { + CreateElement('mordent', null); +}" + +Trill "() { + CreateElement('trill', null); +}" + +Turn "() { + CreateElement('turn', null); +}" + +MeiCorpus "() { + CreateElement('meiCorpus', null); +}" + +App "() { + CreateElement('app', null); +}" + +Lem "() { + CreateElement('lem', null); +}" + +Rdg "() { + CreateElement('rdg', null); +}" + +Abbr "() { + CreateElement('abbr', null); +}" + +Add "() { + CreateElement('add', null); +}" + +Choice "() { + CreateElement('choice', null); +}" + +Corr "() { + CreateElement('corr', null); +}" + +Damage "() { + CreateElement('damage', null); +}" + +Del "() { + CreateElement('del', null); +}" + +Expan "() { + CreateElement('expan', null); +}" + +Gap "() { + CreateElement('gap', null); +}" + +HandShift "() { + CreateElement('handShift', null); +}" + +Orig "() { + CreateElement('orig', null); +}" + +Reg "() { + CreateElement('reg', null); +}" + +Restore "() { + CreateElement('restore', null); +}" + +Sic "() { + CreateElement('sic', null); +}" + +Subst "() { + CreateElement('subst', null); +}" + +Supplied "() { + CreateElement('supplied', null); +}" + +Unclear "() { + CreateElement('unclear', null); +}" + +Facsimile "() { + CreateElement('facsimile', null); +}" + +Surface "() { + CreateElement('surface', null); +}" + +Zone "() { + CreateElement('zone', null); +}" + +Fig "() { + CreateElement('fig', null); +}" + +FigDesc "() { + CreateElement('figDesc', null); +}" + +Graphic "() { + CreateElement('graphic', null); +}" + +Table "() { + CreateElement('table', null); +}" + +Td "() { + CreateElement('td', null); +}" + +Th "() { + CreateElement('th', null); +}" + +Tr "() { + CreateElement('tr', null); +}" + +ComponentGrp "() { + CreateElement('componentGrp', null); +}" + +Expression "() { + CreateElement('expression', null); +}" + +ExpressionList "() { + CreateElement('expressionList', null); +}" + +Item "() { + CreateElement('item', null); +}" + +ItemList "() { + CreateElement('itemList', null); +}" + +Relation "() { + CreateElement('relation', null); +}" + +RelationList "() { + CreateElement('relationList', null); +}" + +Barre "() { + CreateElement('barre', null); +}" + +ChordDef "() { + CreateElement('chordDef', null); +}" + +ChordMember "() { + CreateElement('chordMember', null); +}" + +ChordTable "() { + CreateElement('chordTable', null); +}" + +F "() { + CreateElement('f', null); +}" + +Fb "() { + CreateElement('fb', null); +}" + +Harm "() { + CreateElement('harm', null); +}" + +AccessRestrict "() { + CreateElement('accessRestrict', null); +}" + +AcqSource "() { + CreateElement('acqSource', null); +}" + +AltId "() { + CreateElement('altId', null); +}" + +AppInfo "() { + CreateElement('appInfo', null); +}" + +Application "() { + CreateElement('application', null); +}" + +Audience "() { + CreateElement('audience', null); +}" + +Availability "() { + CreateElement('availability', null); +}" + +CaptureMode "() { + CreateElement('captureMode', null); +}" + +CarrierForm "() { + CreateElement('carrierForm', null); +}" + +Change "() { + CreateElement('change', null); +}" + +ChangeDesc "() { + CreateElement('changeDesc', null); +}" + +ClassCode "() { + CreateElement('classCode', null); +}" + +Classification "() { + CreateElement('classification', null); +}" + +Condition "() { + CreateElement('condition', null); +}" + +ContentItem "() { + CreateElement('contentItem', null); +}" + +Contents "() { + CreateElement('contents', null); +}" + +Context "() { + CreateElement('context', null); +}" + +Correction "() { + CreateElement('correction', null); +}" + +Dimensions "() { + CreateElement('dimensions', null); +}" + +EditionStmt "() { + CreateElement('editionStmt', null); +}" + +EditorialDecl "() { + CreateElement('editorialDecl', null); +}" + +EncodingDesc "() { + CreateElement('encodingDesc', null); +}" + +Ensemble "() { + CreateElement('ensemble', null); +}" + +Event "() { + CreateElement('event', null); +}" + +EventList "() { + CreateElement('eventList', null); +}" + +ExhibHist "() { + CreateElement('exhibHist', null); +}" + +FileChar "() { + CreateElement('fileChar', null); +}" + +FileDesc "() { + CreateElement('fileDesc', null); +}" + +Fingerprint "() { + CreateElement('fingerprint', null); +}" + +Hand "() { + CreateElement('hand', null); +}" + +HandList "() { + CreateElement('handList', null); +}" + +History "() { + CreateElement('history', null); +}" + +IncipCode "() { + CreateElement('incipCode', null); +}" + +IncipText "() { + CreateElement('incipText', null); +}" + +Inscription "() { + CreateElement('inscription', null); +}" + +InstrVoice "() { + CreateElement('instrVoice', null); +}" + +InstrVoiceGrp "() { + CreateElement('instrVoiceGrp', null); +}" + +Instrumentation "() { + CreateElement('instrumentation', null); +}" + +Interpretation "() { + CreateElement('interpretation', null); +}" + +Key "() { + CreateElement('key', null); +}" + +LangUsage "() { + CreateElement('langUsage', null); +}" + +Language "() { + CreateElement('language', null); +}" + +MeiHead "() { + CreateElement('meiHead', null); +}" + +Mensuration "() { + CreateElement('mensuration', null); +}" + +Meter "() { + CreateElement('meter', null); +}" + +Normalization "() { + CreateElement('normalization', null); +}" + +NotesStmt "() { + CreateElement('notesStmt', null); +}" + +OtherChar "() { + CreateElement('otherChar', null); +}" + +PerfMedium "() { + CreateElement('perfMedium', null); +}" + +PhysDesc "() { + CreateElement('physDesc', null); +}" + +PhysMedium "() { + CreateElement('physMedium', null); +}" + +PlateNum "() { + CreateElement('plateNum', null); +}" + +PlayingSpeed "() { + CreateElement('playingSpeed', null); +}" + +Price "() { + CreateElement('price', null); +}" + +ProjectDesc "() { + CreateElement('projectDesc', null); +}" + +Provenance "() { + CreateElement('provenance', null); +}" + +PubStmt "() { + CreateElement('pubStmt', null); +}" + +RevisionDesc "() { + CreateElement('revisionDesc', null); +}" + +SamplingDecl "() { + CreateElement('samplingDecl', null); +}" + +ScoreFormat "() { + CreateElement('scoreFormat', null); +}" + +Segmentation "() { + CreateElement('segmentation', null); +}" + +SeriesStmt "() { + CreateElement('seriesStmt', null); +}" + +SoundChan "() { + CreateElement('soundChan', null); +}" + +Source "() { + CreateElement('source', null); +}" + +SourceDesc "() { + CreateElement('sourceDesc', null); +}" + +SpecRepro "() { + CreateElement('specRepro', null); +}" + +StdVals "() { + CreateElement('stdVals', null); +}" + +SysReq "() { + CreateElement('sysReq', null); +}" + +TapeConfig "() { + CreateElement('tapeConfig', null); +}" + +Term "() { + CreateElement('term', null); +}" + +TermList "() { + CreateElement('termList', null); +}" + +TitleStmt "() { + CreateElement('titleStmt', null); +}" + +TreatHist "() { + CreateElement('treatHist', null); +}" + +TreatSched "() { + CreateElement('treatSched', null); +}" + +Unpub "() { + CreateElement('unpub', null); +}" + +UseRestrict "() { + CreateElement('useRestrict', null); +}" + +Watermark "() { + CreateElement('watermark', null); +}" + +Work "() { + CreateElement('work', null); +}" + +WorkDesc "() { + CreateElement('workDesc', null); +}" + +Timeline "() { + CreateElement('timeline', null); +}" + +When "() { + CreateElement('when', null); +}" + +Lyrics "() { + CreateElement('lyrics', null); +}" + +Verse "() { + CreateElement('verse', null); +}" + +Ligature "() { + CreateElement('ligature', null); +}" + +Mensur "() { + CreateElement('mensur', null); +}" + +Proport "() { + CreateElement('proport', null); +}" + +Cc "() { + CreateElement('cc', null); +}" + +Chan "() { + CreateElement('chan', null); +}" + +ChanPr "() { + CreateElement('chanPr', null); +}" + +Cue "() { + CreateElement('cue', null); +}" + +Hex "() { + CreateElement('hex', null); +}" + +InstrDef "() { + CreateElement('instrDef', null); +}" + +InstrGrp "() { + CreateElement('instrGrp', null); +}" + +Marker "() { + CreateElement('marker', null); +}" + +MetaText "() { + CreateElement('metaText', null); +}" + +Midi "() { + CreateElement('midi', null); +}" + +NoteOff "() { + CreateElement('noteOff', null); +}" + +NoteOn "() { + CreateElement('noteOn', null); +}" + +Port "() { + CreateElement('port', null); +}" + +Prog "() { + CreateElement('prog', null); +}" + +SeqNum "() { + CreateElement('seqNum', null); +}" + +TrkName "() { + CreateElement('trkName', null); +}" + +Vel "() { + CreateElement('vel', null); +}" + +CorpName "() { + CreateElement('corpName', null); +}" + +GeogName "() { + CreateElement('geogName', null); +}" + +PeriodName "() { + CreateElement('periodName', null); +}" + +PersName "() { + CreateElement('persName', null); +}" + +StyleName "() { + CreateElement('styleName', null); +}" + +Ineume "() { + CreateElement('ineume', null); +}" + +Syllable "() { + CreateElement('syllable', null); +}" + +Uneume "() { + CreateElement('uneume', null); +}" + +AvFile "() { + CreateElement('avFile', null); +}" + +Clip "() { + CreateElement('clip', null); +}" + +Performance "() { + CreateElement('performance', null); +}" + +Recording "() { + CreateElement('recording', null); +}" + +Ptr "() { + CreateElement('ptr', null); +}" + +Ref "() { + CreateElement('ref', null); +}" + +Accid "() { + CreateElement('accid', null); +}" + +Actor "() { + CreateElement('actor', null); +}" + +AddrLine "() { + CreateElement('addrLine', null); +}" + +Address "() { + CreateElement('address', null); +}" + +Annot "() { + CreateElement('annot', null); +}" + +Arranger "() { + CreateElement('arranger', null); +}" + +Artic "() { + CreateElement('artic', null); +}" + +Author "() { + CreateElement('author', null); +}" + +BarLine "() { + CreateElement('barLine', null); +}" + +Bibl "() { + CreateElement('bibl', null); +}" + +BiblList "() { + CreateElement('biblList', null); +}" + +BiblScope "() { + CreateElement('biblScope', null); +}" + +Body "() { + CreateElement('body', null); +}" + +Caption "() { + CreateElement('caption', null); +}" + +CastGrp "() { + CreateElement('castGrp', null); +}" + +CastItem "() { + CreateElement('castItem', null); +}" + +CastList "() { + CreateElement('castList', null); +}" + +Chord "() { + CreateElement('chord', null); +}" + +Clef "() { + CreateElement('clef', null); +}" + +ClefGrp "() { + CreateElement('clefGrp', null); +}" + +Composer "() { + CreateElement('composer', null); +}" + +Creation "() { + CreateElement('creation', null); +}" + +Custos "() { + CreateElement('custos', null); +}" + +Date "() { + CreateElement('date', null); +}" + +Dir "() { + CreateElement('dir', null); +}" + +Distributor "() { + CreateElement('distributor', null); +}" + +Dot "() { + CreateElement('dot', null); +}" + +Dynam "() { + CreateElement('dynam', null); +}" + +Edition "() { + CreateElement('edition', null); +}" + +Editor "() { + CreateElement('editor', null); +}" + +Ending "() { + CreateElement('ending', null); +}" + +Expansion "() { + CreateElement('expansion', null); +}" + +Extent "() { + CreateElement('extent', null); +}" + +Funder "() { + CreateElement('funder', null); +}" + +Fw "() { + CreateElement('fw', null); +}" + +Genre "() { + CreateElement('genre', null); +}" + +Group "() { + CreateElement('group', null); +}" + +GrpSym "() { + CreateElement('grpSym', null); +}" + +Identifier "() { + CreateElement('identifier', null); +}" + +Imprint "() { + CreateElement('imprint', null); +}" + +Incip "() { + CreateElement('incip', null); +}" + +KeyAccid "() { + CreateElement('keyAccid', null); +}" + +KeySig "() { + CreateElement('keySig', null); +}" + +Label "() { + CreateElement('label', null); +}" + +Layer "() { + CreateElement('layer', null); +}" + +LayerDef "() { + CreateElement('layerDef', null); +}" + +Lb "() { + CreateElement('lb', null); +}" + +Librettist "() { + CreateElement('librettist', null); +}" + +Lyricist "() { + CreateElement('lyricist', null); +}" + +Mdiv "() { + CreateElement('mdiv', null); +}" + +Mei "() { + CreateElement('mei', null); +}" + +Music "() { + CreateElement('music', null); +}" + +Name "() { + CreateElement('name', null); +}" + +Note "() { + CreateElement('note', null); +}" + +Num "() { + CreateElement('num', null); +}" + +P "() { + CreateElement('p', null); +}" + +Pad "() { + CreateElement('pad', null); +}" + +Part "() { + CreateElement('part', null); +}" + +Parts "() { + CreateElement('parts', null); +}" + +Pb "() { + CreateElement('pb', null); +}" + +PgDesc "() { + CreateElement('pgDesc', null); +}" + +PgFoot "() { + CreateElement('pgFoot', null); +}" + +PgFoot2 "() { + CreateElement('pgFoot2', null); +}" + +PgHead "() { + CreateElement('pgHead', null); +}" + +PgHead2 "() { + CreateElement('pgHead2', null); +}" + +Phrase "() { + CreateElement('phrase', null); +}" + +PhysLoc "() { + CreateElement('physLoc', null); +}" + +PubPlace "() { + CreateElement('pubPlace', null); +}" + +Publisher "() { + CreateElement('publisher', null); +}" + +Recipient "() { + CreateElement('recipient', null); +}" + +RelatedItem "() { + CreateElement('relatedItem', null); +}" + +Rend "() { + CreateElement('rend', null); +}" + +Repository "() { + CreateElement('repository', null); +}" + +Resp "() { + CreateElement('resp', null); +}" + +RespStmt "() { + CreateElement('respStmt', null); +}" + +Rest "() { + CreateElement('rest', null); +}" + +Role "() { + CreateElement('role', null); +}" + +RoleDesc "() { + CreateElement('roleDesc', null); +}" + +Sb "() { + CreateElement('sb', null); +}" + +Score "() { + CreateElement('score', null); +}" + +ScoreDef "() { + CreateElement('scoreDef', null); +}" + +Section "() { + CreateElement('section', null); +}" + +Series "() { + CreateElement('series', null); +}" + +Space "() { + CreateElement('space', null); +}" + +Sponsor "() { + CreateElement('sponsor', null); +}" + +Stack "() { + CreateElement('stack', null); +}" + +Staff "() { + CreateElement('staff', null); +}" + +StaffDef "() { + CreateElement('staffDef', null); +}" + +StaffGrp "() { + CreateElement('staffGrp', null); +}" + +Syl "() { + CreateElement('syl', null); +}" + +Tempo "() { + CreateElement('tempo', null); +}" + +TextLang "() { + CreateElement('textLang', null); +}" + +Title "() { + CreateElement('title', null); +}" + +TitlePage "() { + CreateElement('titlePage', null); +}" + +Back "() { + CreateElement('back', null); +}" + +Div "() { + CreateElement('div', null); +}" + +Front "() { + CreateElement('front', null); +}" + +Head "() { + CreateElement('head', null); +}" + +L "() { + CreateElement('l', null); +}" + +Lg "() { + CreateElement('lg', null); +}" + +Li "() { + CreateElement('li', null); +}" + +List "() { + CreateElement('list', null); +}" + +Quote "() { + CreateElement('quote', null); +}" + +AnchoredText "() { + CreateElement('anchoredText', null); +}" + +Curve "() { + CreateElement('curve', null); +}" + +Line "() { + CreateElement('line', null); +}" + +Symbol "() { + CreateElement('symbol', null); +}" + +SymbolDef "() { + CreateElement('symbolDef', null); +}" + +SymbolTable "() { + CreateElement('symbolTable', null); +}" + + +Initialize "() { + tree_doc = CreateSparseArray(); + flat_doc = CreateDictionary(); + id_incr = 0; + + Self._property:XMLIdToObjectMap = CreateDictionary(); + Self._property:MEIDocument = tree_doc; + Self._property:MEIFlattened = flat_doc; + Self._property:MEIID = id_incr; +}" + + XMLComment "(comment) { + commentObj = Create(' +'; + return xmlout; + } + + if (ch or Length(tx) > 0) + { + terminalTag = false; + } + + xmlout = createXmlTag(nm, id, at, terminalTag); + + if (Length(tx) > 0) + { + endchar = ''; + xmlout = xmlout & tx; + } + else + { + xmlout = xmlout & ' +'; + } + + if (ch.Length > 0) + { + indent = indent + 1; + for each child in ch + { + xmlout = xmlout & tabs & convertDictToXml(child, indent); + } + indent = indent - 1; + } + + if (Length(tl) > 0) + { + xmlout = xmlout & tl; + } + + // convertDictToXml takes care of adding the /> + // for tags that do not have children. We'll + // take care of the terminal tag here for those + // that do. + if (not terminalTag) + { + if (Length(tx) > 0) + { + xmlout = xmlout & ' +'; + } + else + { + tabs = Substring(tabs, 0, Length(tabs) - 4); + xmlout = xmlout & tabs & ' +'; + } + } + + return xmlout; +}" + + _exportMeiDocument "(meidoc) { + xdecl = ' +'; + indent = 0; + meiout = xdecl & convertDictToXml(meidoc[0], indent); + + return meiout; + }" + + meiDocumentToFile "(meidoc, filename) { + meiout = _exportMeiDocument(meidoc); + Sibelius.CreateTextFile(filename); + Sibelius.AppendTextFile(filename, meiout, 1); + + return true; +}" + + meiDocumentToString "(meidoc) { + return _exportMeiDocument(meidoc); + }" + documentFromFile "(filename) { + res = _xmlImport(filename); + + return res; +}" + popMode "(arr) { + if (arr.Length > 0) { + return arr.Pop(); + } else { + // return PRE + return 15; + } +}" + _encodeEntities "(string) + { + /* + Returns an entity-encoded version of the string. + */ + if (string = '') + { + return string; + } + + nc = Chr(10); + quote = Chr(34); + apos = Chr(39); + lthan = Chr(60); + gthan = Chr(62); + amp = Chr(38); + + // & must go first so it doesn't replace it in the character encoding + string = utils.Replace(string, amp, '&', true); + string = utils.Replace(string, nc, ' ', true); + string = utils.Replace(string, quote, '"', true); + string = utils.Replace(string, apos, ''', true); + string = utils.Replace(string, lthan, '<', true); + string = utils.Replace(string, gthan, '>', true); + + return string; + }" + _xmlImport "(filename) { + /* + Based on the Quick-n-Dirty XML parser at + http://www.javaworld.com/javatips/jw-javatip128.html + */ + xmlinput = Sibelius.ReadTextFile(filename, true); + meidoc = CreateSparseArray(); + TEXT = 1; + ENTITY = 2; + OPEN_TAG = 3; + CLOSE_TAG = 4; + START_TAG = 5; + ATTRIBUTE_LVALUE = 6; + ATTRIBUTE_EQUAL = 9; + ATTRIBUTE_RVALUE = 10; + QUOTE = 7; + IN_TAG = 8; + SINGLE_TAG = 12; + COMMENT = 13; + DONE = 11; + DOCTYPE = 14; + PRE = 15; + CDATA = 16; + + mode = PRE; + depth = 0; + c = 0; + quotec = Chr(34); + sb = CreateSparseArray(); + etag = CreateSparseArray(); + tagName = ''; + lvalue = false; + rvalue = false; + attrs = CreateDictionary(); + st = CreateSparseArray(); + lnum = 1; + col = 0; + eol = false; + parentTag = CreateSparseArray(); + + for each line in xmlinput { + for col = 0 to Length(line) { + // col will be the character at that position in the line. + c = CharAt(line, col); + switch(mode) { + case(DONE) { + //trace('done!'); + return true; + } + // We are between tags collecting text. + case(TEXT) { + //trace('text'); + switch(c) { + case ('<') { + st.Push(mode); + mode = START_TAG; + if (sb.Length > 0) { + // something important goes on here... + // doc.text(sb.toString()); + sb.Length = 0; + } + } + case ('&') { + st.Push(mode); + mode = ENTITY; + etag.Length = 0; + } + default { + sb.Push(c); + } + } + } + // we are processing a closing tag: e.g. + case (CLOSE_TAG) { + //trace('close tag'); + if (c = '>') { + mode = popMode(st); + tagName = sb.Join(''); + sb.Length = 0; + depth = depth - 1; + p = parentTag.Pop(); + if (depth = 0) { + meidoc.Push(p); + mode = DONE; + // doc.endElement(tagName); + } + } else { + sb.Push(c); + } + } + // we are processing CDATA + case (CDATA) { + //trace('cdata'); + checktag = sb.Join(''); + if (c = '>' and CharAt(checktag, -1) = ']]') { + sb.Length = sb.Length - 2; + // doc.text(sb.toString); + sb.Length = 0; + mode = popMode(st); + } else { + sb.Push(c); + } + } + // we are processing a comment. We are inside + // the looking for the -->. + case (COMMENT) { + //trace('comment'); + checktag = sb.Join(''); + if (c = '>' and Substring(checktag, -2) = '--') { + sb.Length = 0; + mode = popMode(st); + } else { + sb.Push(c); + } + } + // We are outside the root tag element + case (PRE) { + //trace('pre'); + if (c = '<') { + mode = TEXT; + st.Push(mode); + mode = START_TAG; + } + } + // We are inside one of these + // or one of these + case (DOCTYPE) { + //trace('doctype'); + if (c = '>') { + mode = popMode(st); + if (mode = TEXT) { + mode = PRE; + } + } + } + // we have just seen a < and + // are wondering what we are looking at + // , , , etc. + case (START_TAG) { + //trace('start tag'); + mode = popMode(st); + switch(c) { + case ('/') { + st.Push(mode); + mode = CLOSE_TAG; + } + case ('?') { + mode = DOCTYPE; + } + default { + st.Push(mode); + mode = OPEN_TAG; + tagName = ''; + attrs = CreateDictionary(); + sb.Push(c); + } + } + } + // we are processing an entity, e.g. <, », etc. + case (ENTITY) { + //trace('entity'); + if (c = ';') { + mode = popMode(st); + cent = etag.Join(''); + etag.Length = 0; + switch (cent) { + case ('lt') { + sb.Push('<'); + } + case ('gt') { + sb.Push('>'); + } + case ('amp') { + sb.Push('&'); + } + case ('quot') { + sb.Push(Chr(34)); + } + case ('apos') { + sb.Push(Chr(39)); + } + default { + if (CharAt(cent, 0) = '#') { + sb.Push(Substring(cent, 1)); + } else { + trace('Unknown entity ' & cent & ' at line ' & lnum & ' and col ' & col); + } + } + } + } else { + etag.Push(c); + } + } + // we have just seen something like this: + // . + case (SINGLE_TAG) { + //trace('single tag'); + if (tagName = '') { + tagName = sb.Join(''); + } + if (c != '>') { + trace('Expected > for tag: <' & tagName & '/> at line ' & lnum & ' and col ' & col); + } + // doc.startElement(tagName, attrs); + ent = createEntry(tagName); + libmei.setAttributes(ent, attrs); + libmei.addChild(parentTag[-1], ent); + Self.MEIFlattened.Push(ent); + + // doc.endElement(tagName); + if (depth = 0) { + // doc.endDocument(); + return true; + } + sb.Length = 0; + attrs = CreateDictionary(); + tagName = ''; + mode = popMode(st); + } + // we are processing something + // like this . It could + // still be a or something. + case (OPEN_TAG) { + //trace('open tag'); + checktag = sb.Join(''); + switch (c) { + case ('>') { + if (tagName = '') { + tagName = sb.Join(''); + } + ent = createEntry(tagName); + libmei.setAttributes(ent, attrs); + libmei.addChild(parentTag[-1], ent); + parentTag.Push(ent); + Self.MEIFlattened.Push(ent); + + sb.Length = 0; + depth = depth + 1; + tagName = ''; + attrs = CreateDictionary(); + mode = popMode(st); + } + case ('/') { + mode = SINGLE_TAG; + } + case ('-') { + if (checktag = '!-') { + //trace('checktag'); + //trace(checktag); + mode = COMMENT; + } + } + case ('[') { + if (checktag = '![CDATA') { + mode = CDATA; + sb.Length = 0; + } + } + case ('E') { + if (checktag = '!DOCTYP') { + sb.Length = 0; + mode = DOCTYPE; + } + } + case (' ') { + tagName = sb.Join(''); + sb.Length = 0; + mode = IN_TAG; + } + default { + sb.Push(c); + } + } + } + // We are processing the quoted right-hand side + // of an element's attribute. + case (QUOTE) { + //trace('quote'); + switch(c) { + case (quotec) { + rvalue = sb.Join(''); + sb.Length = 0; + attrs[lvalue] = rvalue; + mode = IN_TAG; + } + // not sure what this does + case (' ') { + sb.Push(' '); + } + case ('&') { + st.Push(mode); + mode = ENTITY; + etag.Length = 0; + } + default { + sb.Push(c); + } + } + } + case (ATTRIBUTE_RVALUE) { + //trace('rvalue'); + switch(c) { + case (Chr(34) or Chr(39)) { + quotec = c; + mode = QUOTE; + } + case (' ') { + ; + } + default { + trace('Error in attribute processing at line ' & lnum & ' col' & col); + } + } + } + case (ATTRIBUTE_LVALUE) { + //trace('lvalue'); + switch (c) { + case (' ') { + lvalue = sb.Join(''); + sb.Length = 0; + mode = ATTRIBUTE_EQUAL; + } + case ('=') { + lvalue = sb.Join(''); + sb.Length = 0; + mode = ATTRIBUTE_RVALUE; + } + default { + sb.Push(c); + } + } + } + case (ATTRIBUTE_EQUAL) { + //trace('equal'); + switch (c) { + case ('=') { + mode = ATTRIBUTE_RVALUE; + } + case (' ') { + ; + } + default { + trace('Error in attribute processing at line ' & lnum & ' col' & col); + } + } + } + case (IN_TAG) { + //trace(parentTag); + //trace('in tag'); + switch(c) { + case ('>') { + mode = popMode(st); + // doc.startElement(tagname, attrs); + ent = createEntry(tagName); + libmei.setAttributes(ent, attrs); + if (parentTag.Length > 0) { + libmei.addChild(parentTag[-1], ent); + } + parentTag.Push(ent); + Self.MEIFlattened.Push(ent); + + depth = depth + 1; + tagName = ''; + attrs = CreateDictionary(); + } + case ('/') { + mode = SINGLE_TAG; + } + case (' ') { + ; + } + default { + mode = ATTRIBUTE_LVALUE; + sb.Push(c); + } + } + } + } + } + lnum = lnum + 1; + } + return meidoc; +}" + +generateRandomID "() { +//$module(ExportGenerators.mss) + id = Self._property:MEIID + 1; + Self._property:MEIID = id; + id = 'm-' & id; + return id; +}" + +removeKeyFromDictionary "(dict, key) { + newdict = CreateDictionary(); + for each Pair p in dict + { + if (p.Name != key) + { + newdict[p.Name] = p.Value; + } + } + + return newdict; +}" +} + +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1cd1bf3 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "sibmei2", + "version": "2.0.0", + "description": "", + "main": "plgconfig.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "gulp": "^3.9.0", + "gulp-spawn": "^0.3.0", + "gulp-util": "^3.0.6", + "q": "^1.4.1" + } +} diff --git a/plgconfig.js b/plgconfig.js new file mode 100644 index 0000000..e5eeb25 --- /dev/null +++ b/plgconfig.js @@ -0,0 +1,14 @@ +var config = { + plgPath: process.env.HOME + '/Library/Application Support/Avid/Sibelius 7.5/Plugins', + plgCategory: 'MEI Export', + pluginFilename: 'sibmei2.plg', + linkLibraries: ['libmei.plg'], + importDir: './import', + buildDir: './build', + srcDir: './src', + testDir: './test', + libDir: './lib', +}; + +module.exports = config; + diff --git a/sibs/accidentals.sib b/sibs/accidentals.sib new file mode 100644 index 0000000000000000000000000000000000000000..f5649922b62d0f8dc482634e4f7c537d43b2392d GIT binary patch literal 38808 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 literal 0 HcmV?d00001 diff --git a/sibs/beams.sib b/sibs/beams.sib new file mode 100644 index 0000000000000000000000000000000000000000..20df982d2fc510ca63ebe05b52225595e28cbaf2 GIT binary patch literal 38815 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 literal 0 HcmV?d00001 diff --git a/sibs/header.sib b/sibs/header.sib new file mode 100644 index 0000000000000000000000000000000000000000..e1283ca7a8f8a75137807845b70ef408f8797b3d GIT binary patch literal 30801 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

1|r9}w2e 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 literal 0 HcmV?d00001 diff --git a/sibs/staves.sib b/sibs/staves.sib new file mode 100644 index 0000000000000000000000000000000000000000..ae9ededa3bdfe9c0919b4f7b7185d2b6d5395dd5 GIT binary patch literal 47572 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 5) + { + // prevent a runaway loop. + counter = 1000000000; + } + } + } + + switch (powcount) + { + case (pow >= 4096) + { + ret[0] = 'long'; + durset = true; + } + case (pow >= 2048) + { + ret[0] = 'breve'; + durset = true; + } + default + { + if (durset = false) + { + ret[0] = 1024 / pow; + } + } + } + + if (dots = 0) + { + ret[1] = ' '; + } + else + { + ret[1] = dots; + } + + return ret; +} //$end + +function ConvertKeySignature (numsharps) { + //$module(ExportConverters.mss) + switch (numsharps) + { + case (0) + { + // key of c + return '0'; + } + case (-8) + { + // atonal in Sibelius + return '0'; + } + case (numsharps > 0) + { + // sharps + return numsharps & 's'; + } + case (numsharps < 0) + { + //flats + return utils.AbsoluteValue(numsharps) & 'f'; + } + } +} //$end + +function PitchesInKeySignature (keysig) { + //$module(ExportConverters.mss) + + // keysig is 7 >= 0 >= -7, for the number of sharps (negative is flats) + ac = CreateSparseArray('F', 'C', 'G', 'D', 'A', 'E', 'B'); + if (keysig = 0) + { + return CreateSparseArray(); + } + + if (keysig > 0) + { + return ac.Slice(0, keysig); + } + else + { + v = ac.Slice(keysig); + v.Reverse(); + return v; + } +} //$end + +function ConvertAccidental (noteobj) { + //$module(ExportConverters.mss) + // If accidentals are audible, but not visible, you get @accid.ges + // If accidentals are both audible and visible, you get @accid + // is_visible is not to be confused with hidden accidentals! is_visible + // just determines whether an accidental is shown or not based on + // the rules of CMN. + + // Returns a tuple [0 => accid (string), 1 => is_visible (bool)] + // If the accidental is a natural and is visible, returns ('n', true); otherwise, + // it returns ('', false); + + // first, determine if the accidental is visible. + is_visible = HasVisibleAccidental(noteobj); + ac = ' '; + + pname = Substring(noteobj.Name, 0, 1); // captures first letter + accid = Substring(noteobj.Name, 1); // captures all other characters + + switch(accid) + { + case('bb') + { + ac = 'ff'; + } + case('b-') + { + ac = 'fd'; + } + case('b') + { + ac = 'f'; + } + case('-') + { + ac = 'fu'; + } + case('') + { + if (is_visible = True) + { + ac = 'n'; + } + } + case('+') + { + ac = 'sd'; + } + case('#') + { + ac = 's'; + } + case('#+') + { + ac = 'su'; + } + case('x') + { + ac = 'x'; + } + case('##') + { + ac = 'ss'; + } + } + + ret = CreateSparseArray(ac, is_visible); + return ret; +} //$end + +function HasVisibleAccidental (noteobj) { + //$module(ExportConverters.mss) + // determines whether a note is *likely* to have a visible accidental. + // Caution: This is probably not 100% accurate. + + // Returns a boolean if the note is visible. + + // If it has a cautionary accidental, it's most likely to be visible. + if (noteobj.AccidentalStyle = CautionaryAcc) + { + return True; + } + + if (noteobj.AccidentalStyle = HiddenAcc) + { + return False; + } + + keysig = noteobj.ParentNoteRest.ParentBar.GetKeySignatureAt(noteobj.ParentNoteRest.Position); + sf = sibmei2.PitchesInKeySignature(keysig.Sharps); + pname = Substring(noteobj.Name, 0, 1); // captures first letter + accid = Substring(noteobj.Name, 1); // captures all other characters + + // if the note is not in the key signature, then it should have an accidental + note_is_in_keysig = utils.IsInArray(sf, pname); + has_prev_pitch_with_accidental = False; + + parent_nr = noteobj.ParentNoteRest; + parent_bar = parent_nr.ParentBar; + + for each NoteRest nr in parent_bar + { + if (nr.Position < parent_nr.Position) + { + for each n in nr + { + pname2 = Substring(n.Name, 0, 1); // captures first letter + accid2 = Substring(n.Name, 1); // captures all other characters + + if (n.Name = noteobj.Name and note_is_in_keysig = False and n.Accidental != 0) + { + has_prev_pitch_with_accidental = True; + } + + if (n.Name = noteobj.Name and n.AccidentalStyle = CautionaryAcc) + { + has_prev_pitch_with_accidental = True; + } + + if (n.Name = noteobj.Name and note_is_in_keysig = True) + { + has_prev_pitch_with_accidental = False; + } + + // this is a special case for dealing with naturals. If the pitch names + // match, and the note is not in the key signature, and the previous pitch + // was not empty, then we probably have a natural on the query note. + if (pname = pname2 and note_is_in_keysig = False and accid2 != '') + { + has_prev_pitch_with_accidental = True; + } + + } + } + else + { + for each n in nr + { + if (n.Name = noteobj.Name and n.Accidental != 0 and note_is_in_keysig = True) + { + has_prev_pitch_with_accidental = False; + } + } + } + } + + // deal with the 'weird' accidental values that don't have a value in noteobj.Accidental + switch (accid) + { + case ('bb') + { + ret = (has_prev_pitch_with_accidental != True); + return ret; + } + case ('b-') + { + ret = (has_prev_pitch_with_accidental != True); + return ret; + } + case ('-') + { + ret = (has_prev_pitch_with_accidental != True); + return ret; + } + case ('+') + { + ret = (has_prev_pitch_with_accidental != True); + return ret; + } + case ('#+') + { + ret = (has_prev_pitch_with_accidental != True); + return ret; + } + } + + if (noteobj.Accidental = 0 and note_is_in_keysig = True and has_prev_pitch_with_accidental = False) + { + // it's a natural? + return True; + } + + if (note_is_in_keysig = True and has_prev_pitch_with_accidental = False) + { + return False; + } + + if (has_prev_pitch_with_accidental = False and noteobj.Accidental != 0) + { + return True; + } + + if (has_prev_pitch_with_accidental = True and accid = '') + { + // this is the corresponding return value for special cased naturals. + return True; + } + + // Finally, by default, assume this has no accidental. + return False; +} //$end + +function ConvertNamedTimeSignature (timesig) { + //$module(ExportConverters.mss) + switch(timesig) + { + case(CommonTimeString) + { + return 'common'; + } + case(AllaBreveTimeString) + { + return 'cut'; + } + default + { + return ' '; + } + } +} //$end + +function ConvertBracket (bracket) { + //$module(ExportConverters.mss) + switch(bracket) + { + case(BracketFull) + { + return 'bracket'; + } + case(BracketBrace) + { + return 'brace'; + } + case(BracketSub) + { + return 'line'; + } + default + { + return 'none'; + } + } +} //$end + +function ConvertSibeliusStructure (score) { + //$module(ExportConverters.mss) + // Takes in the Staff/Bar Sibelius Structure and returns a Bar/Staff + // mapping for our MEI writers. + bar_to_staff = CreateDictionary(); + + // Invert the Sibelius structure + for each Staff s in score + { + for each Bar b in s + { + if (bar_to_staff.PropertyExists(b.BarNumber)) + { + bar_to_staff[b.BarNumber].Push(s.StaffNum); + } + else + { + bar_to_staff[b.BarNumber] = CreateSparseArray(); + bar_to_staff[b.BarNumber].Push(s.StaffNum); + } + } + } + return bar_to_staff; +} //$end + +function ConvertColor (nrest) { + //$module(ExportConverters.mss) + r = nrest.ColorRed; + g = nrest.ColorGreen; + b = nrest.ColorBlue; + a_dec = nrest.ColorAlpha & '.0'; + a = a_dec / 255.0; + + return 'rgba(' & r & ',' & g & ',' & b & ',' & a & ')'; +} //$end + +function ConvertNoteStyle (style) { + //$module(ExportConverters.mss) + noteStyle = ' '; + + if (style = NormalNoteStyle) + { + return ' '; + } + + switch (style) + { + case (CrossNoteStyle) + { + noteStyle = 'cross'; + } + case (DiamondNoteStyle) + { + noteStyle = 'diamond'; + } + case (CrossOrDiamondNoteStyle) + { + // Sibelius uses this for percussion + // and does not differentiate in the + // head style, so we have to choose one + // or the other. + noteStyle = 'cross'; + } + case (BlackAndWhiteDiamondNoteStyle) + { + noteStyle = 'filldiamond'; + } + case (SlashedNoteStyle) + { + noteStyle = 'addslash'; + } + case (BackSlashedNoteStyle) + { + noteStyle = 'addbackslash'; + } + case (ArrowDownNoteStyle) + { + // this is not completely correct, since + // we use the same value for up and down + // iso triangles. But it's all we have for now. + noteStyle = 'isotriangle'; + } + case (ArrowUpNoteStyle) + { + noteStyle = 'isotriangle'; + } + case (InvertedTriangleNoteStyle) + { + noteStyle = 'isotriangle'; + } + case (ShapedNote1NoteStyle) + { + noteStyle = 'isotriangle'; + } + case (ShapedNote2NoteStyle) + { + noteStyle = 'semicircle'; + } + case (ShapedNote3NoteStyle) + { + noteStyle = 'diamond'; + } + case (ShapedNote4StemUpNoteStyle) + { + noteStyle = 'rtriangle'; + } + case (ShapedNote4StemDownNoteStyle) + { + noteStyle = 'rtriangle'; + } + case (ShapedNote5NoteStyle) + { + // this looks normal... + noteStyle = ' '; + } + case (ShapedNote6NoteStyle) + { + // there is no square in MEI... + noteStyle = ' '; + } + case (ShapedNote7NoteStyle) + { + noteStyle = 'piewedge'; + } + } + + return noteStyle; +} //$end + +function ConvertSlurStyle (style) { + //$module(ExportConverters.mss) + slurparts = MSplitString(style, '.'); + direction = ' '; + style = ' '; + + switch(slurparts[3]) + { + case ('up') + { + direction = 'above'; + } + case ('down') + { + direction = 'below'; + } + default + { + direction = ' '; + } + } + switch(slurparts[4]) + { + case ('dashed') + { + style = 'dashed'; + } + case ('dotted') + { + style = 'dotted'; + } + default + { + style = ' '; + } + } + return CreateSparseArray(direction, style); +} //$end + +function ConvertPositionToTimestamp (position, bar) { + //$module(ExportConverters.mss) + /* + To convert Sibelius ticks to musical timestamps + we use the formula: + + tstamp = (notePosition / (barLength / beatsInBar)) + */ + + // make sure we're working with floating point numbers + // and yes, this makes me feel very, very dirty in case + // you were wondering, but this is the only way ManuScript + // can cast to floating point... + barlength = bar.Length; + timesignature = Sibelius.ActiveScore.SystemStaff.CurrentTimeSignature(bar.BarNumber); + + if (position = 0) + { + return 1; + } + + barlen = barlength & '.0'; + pos = position & '.0'; + beats = timesignature.Numerator & '.0'; + unit = (barlen / beats); + ret = (pos / unit) + 1; + + return ret; +} //$end + +function ConvertTupletStyle (tupletStyle) { + //$module(ExportConverters.mss) + switch (tupletStyle) + { + case(TupletNoNumber) + { + libmei.addAttribute(activeTuplet, 'dur.visible', 'false'); + } + case(TupletLeft) + { + libmei.addAttribute(activeTuplet, 'num.format', 'count'); + } + case(TupletLeftRight) + { + libmei.addAttribute(activeTuplet, 'num.format', 'ratio'); + } + } + +} //$end + +function ConvertBarline (linetype) { + //$module(ExportConverters.mss) + switch(linetype) + { + case (SpecialBarlineStartRepeat) + { + // start repeat + return 'rptstart'; + } + case (SpecialBarlineEndRepeat) + { + // end repeat + return 'rptend'; + } + case (SpecialBarlineDashed) + { + // dashed + return 'dashed'; + } + case (SpecialBarlineDouble) + { + // double + return 'dbl'; + } + case (SpecialBarlineFinal) + { + // final + return 'end'; + } + case (SpecialBarlineInvisible) + { + // invisible + return 'invis'; + } + case (SpecialBarlineBetweenStaves) + { + // between staves + // no MEI equiv. + return ' '; + } + case (SpecialBarlineNormal) + { + // normal + // this should usually be needed. + return 'single'; + } + case (SpecialBarlineTick) + { + // tick + // unknown + return ' '; + } + case (SpecialBarlineShort) + { + // short + // unknown + return ' '; + } + default + { + return ' '; + } + } +} //$end + +function ConvertText (textobj) { + //$module(ExportConverters.mss) + styleid = textobj.StyleId; + switch (styleid) + { + case ('text.staff.expression') + { + dynam = libmei.Dynam(); + libmei.SetText(dynam, lstrip(textobj.Text)); + libmei.AddAttribute(dynam, 'staff', textobj.ParentBar.ParentStaff.StaffNum); + libmei.AddAttribute(dynam, 'tstamp', ConvertPositionToTimestamp(textobj)); + + if (textobj.Dx != 0) + { + libmei.AddAttribute(dynam, 'ho', ConvertOffset(textobj.Dx)); + } + + if (textobj.Dy != 0) + { + libmei.AddAttribute(dynam, 'vo', ConvertOffset(textobj.Dy)); + } + return dynam; + } + case ('text.system.page_aligned.title') + { + return ConvertTextElement(textobj); + } + case ('text.system.page_aligned.composer') + { + return ConvertTextElement(textobj); + } + default + { + return null; + } + } +} //$end + +function ConvertTextElement (textobj) { + //$module(ExportConverters.mss) + obj = libmei.AnchoredText(); + libmei.SetText(obj, lstrip(textobj.Text)); + + if (textobj.Dx != 0) + { + libmei.AddAttribute(obj, 'ho', ConvertOffsets(textobj.Dx)); + } + + if (textobj.Dy != 0) + { + libmei.AddAttribute(obj, 'vo', ConvertOffset(textobj.Dy)); + } + + return obj; +} //$end + +function ConvertEndingValues (styleid) { + //$module(ExportConverters) + ending_style = MSplitString(styleid, '.'); + num = ' '; + label = ' '; + type = ' '; + + switch(ending_style[3]) + { + case ('1st') + { + num = 1; + label = '1.'; + type = 'closed'; + } + case ('1st_n_2nd') + { + num = 1; + label = '1. 2.'; + type = 'closed'; + } + case ('2nd') + { + num = 2; + label = '2.'; + if (ending_style[-1] = 'closed') + { + type = 'closed'; + } + else + { + type = 'open'; + } + } + case ('3rd') + { + num = 3; + label = '3.'; + type = 'closed'; + } + case ('open') + { + type = 'open'; + } + case ('closed') + { + type = 'closed'; + } + } + + return CreateSparseArray(num, label, type); + +} //$end diff --git a/src/ExportGenerators.mss b/src/ExportGenerators.mss new file mode 100644 index 0000000..c9009cf --- /dev/null +++ b/src/ExportGenerators.mss @@ -0,0 +1,1097 @@ +function GenerateMEIHeader () { + //$module(ExportGenerators.mss) + // takes in a Sibelius Score object + // returns a libmei tree (i.e., nested objects and arrays) with a MEI header with metadata + score = Self._property:ActiveScore; + header = libmei.MeiHead(); + fileD = libmei.FileDesc(); + titleS = libmei.TitleStmt(); + libmei.AddChild(header, fileD); + libmei.AddChild(fileD, titleS); + + workDesc = libmei.WorkDesc(); + wd_work = libmei.Work(); + wd_titleStmt = libmei.TitleStmt(); + wd_title = libmei.Title(); + wd_respStmt = libmei.RespStmt(); + libmei.AddChild(wd_titleStmt, wd_title); + libmei.AddChild(wd_titleStmt, wd_respStmt); + libmei.AddChild(wd_work, wd_titleStmt); + libmei.AddChild(workDesc, wd_work); + + title = libmei.Title(); + libmei.AddChild(titleS, title); + + if (score.Title != '') + { + libmei.SetText(title, score.Title); + libmei.SetText(wd_title, score.Title); + } + if (score.Subtitle != '') + { + subtitle = libmei.Title(); + libmei.AddChild(titleS, subtitle); + libmei.SetText(subtitle, score.Subtitle); + libmei.AddAttribute(subtitle, 'type', 'subtitle'); + } + if (score.Composer != '') + { + composer = libmei.Composer(); + libmei.AddChild(titleS, composer); + libmei.SetText(composer, score.Composer); + wd_composer = libmei.PersName(); + libmei.AddAttribute(wd_composer, 'role', 'composer'); + libmei.SetText(wd_composer, score.Composer); + libmei.AddChild(wd_respStmt, wd_composer); + } + if (score.Lyricist != '') + { + lyricist = libmei.Lyricist(); + libmei.AddChild(titleS, lyricist); + libmei.SetText(lyricist, score.Lyricist); + wd_lyricist = libmei.PersName(); + libmei.AddAttribute(wd_lyricist, 'role', 'lyricist'); + libmei.SetText(wd_lyricist, score.Lyricist); + libmei.AddChild(wd_respStmt, wd_lyricist); + } + if (score.Arranger != '') + { + arranger = libmei.Arranger(); + libmei.AddChild(titleS, arranger); + libmei.SetText(arranger, score.Arranger); + wd_arranger = libmei.PersName(); + libmei.AddAttribute(wd_arranger, 'role', 'arranger'); + libmei.SetText(wd_arranger, score.Arranger); + libmei.AddChild(wd_respStmt, wd_arranger); + } + if (score.OtherInformation != '') + { + wd_notesStmt = libmei.NotesStmt(); + ns_annot = libmei.Annot(); + libmei.AddChild(wd_work, wd_notesStmt); + libmei.AddChild(wd_notesStmt, ns_annot); + libmei.SetText(ns_annot, score.OtherInformation); + } + + respS = libmei.RespStmt(); + libmei.AddChild(titleS, respS); + persN = libmei.PersName(); + libmei.AddChild(respS, persN); + pubS = libmei.PubStmt(); + libmei.AddChild(fileD, pubS); + + avail = libmei.Availability(); + ur = libmei.UseRestrict(); + libmei.AddChild(avail, ur); + libmei.AddChild(pubS, avail); + libmei.SetText(ur, score.Copyright); + + encodingD = libmei.EncodingDesc(); + libmei.AddChild(header, encodingD); + appI = libmei.AppInfo(); + libmei.AddChild(encodingD, appI); + + applic = libmei.Application(); + libmei.SetId(applic, 'sibelius7'); + libmei.AddChild(appI, applic); + libmei.AddAttribute(applic, 'version', Sibelius.ProgramVersion); + nm = libmei.Name(); + libmei.SetText(nm, 'Sibelius (' & Version & ')'); + libmei.AddChild(applic, nm); + + libmei.AddChild(header, workDesc); + + return header; +} //$end + +function GenerateMEIMusic () { + //$module(ExportGenerators.mss) + score = Self._property:ActiveScore; + + Self._property:TieResolver = CreateDictionary(); + Self._property:LyricWords = CreateDictionary(); + Self._property:SpecialBarlines = CreateDictionary(); + Self._property:SystemText = CreateDictionary(); + Self._property:LayerObjectPositions = null; + Self._property:ObjectPositions = CreateDictionary(); + + // the section parent is used in case we need to inject + // a new parent later (e.g., for endings) + Self._property:SectionParent = null; + Self._property:VoltaBars = CreateDictionary(); + Self._property:ActiveVolta = null; + Self._property:VoltaElement = null; + + // grab some global markers from the system staff + // This will store it for later use. + ProcessSystemStaff(score); + + music = libmei.Music(); + body = libmei.Body(); + mdiv = libmei.Mdiv(); + sco = libmei.Score(); + + libmei.AddChild(music, body); + libmei.AddChild(body, mdiv); + libmei.AddChild(mdiv, sco); + + scd = sibmei2.GenerateScoreDef(score); + libmei.AddChild(sco, scd); + + barmap = ConvertSibeliusStructure(score); + numbars = barmap.GetPropertyNames(); + numbars = numbars.Length; + Self._property:BarMap = barmap; + + section = libmei.Section(); + libmei.AddChild(sco, section); + + for j = 1 to numbars + 1 + { + // this value may get changed by the volta processor + // to inject a new parent in the hierarchy. + progressMsg = utils.Format(_ExportingBars, j, numbars); + cont = Sibelius.UpdateProgressDialog(j, progressMsg); + + if (cont = 0) + { + ExitPlugin(); + } + + m = GenerateMeasure(j); + ending = ProcessVolta(j); + + if (ending != null) + { + libmei.AddChild(section, ending); + libmei.AddChild(ending, m); + } + else + { + libmei.AddChild(section, m); + } + } + + return music; +} //$end + +function GenerateMeasure (num) { + //$module(ExportGenerators.mss) + + score = Self._property:ActiveScore; + // measureties + Self._property:MeasureTies = CreateSparseArray(); + Self._property:MeasureLines = CreateSparseArray(); + + m = libmei.Measure(); + libmei.AddAttribute(m, 'n', num); + + barmap = Self._property:BarMap; + staves = barmap[num]; + children = CreateSparseArray(); + + // since so much metadata about the staff and other context + // is available on the bar that should now be on the measure, go through the bars + // and try to extract it. + + for i = 1 to staves.Length + 1 + { + this_staff = score.NthStaff(i); + bar = this_staff[num]; + + if (bar.ExternalBarNumberString) + { + libmei.AddAttribute(m, 'label', bar.ExternalBarNumberString); + } + + s = GenerateStaff(i, num); + libmei.AddChild(m, s); + } + + mties = Self._property:MeasureTies; + + for each tie in mties + { + m.children.Push(tie); + } + + mlines = Self._property:MeasureLines; + + for each line in mlines + { + m.children.Push(line); + } + + specialbarlines = Self._property:SpecialBarlines; + + if (specialbarlines.PropertyExists(num)) + { + bline = specialbarlines[num]; + + if (bline = 'rptstart') + { + libmei.AddAttribute(m, 'left', bline); + } + else + { + libmei.AddAttribute(m, 'right', bline); + } + } + + systemtext = Self._property:SystemText; + + if (systemtext.PropertyExists(num)) + { + textobjs = systemtext[num]; + for each textobj in textobjs + { + text = ConvertText(textobj); + + if (text != null) + { + libmei.AddChild(m, text); + } + } + } + + return m; +} //$end + + +function GenerateStaff (staffnum, measurenum) { + //$module(ExportGenerators.mss) + score = Self._property:ActiveScore; + this_staff = score.NthStaff(staffnum); + bar = this_staff[measurenum]; + + stf = libmei.Staff(); + + if (bar.OnHiddenStave) + { + libmei.AddAttribute(stf, 'visible', 'false'); + } + + layers = GenerateLayers(staffnum, measurenum); + // NB: Completely resets any previous children! + libmei.SetChildren(stf, layers); + + return stf; +} //$end + +function GenerateLayers (staffnum, measurenum) { + //$module(ExportGenerators.mss) + layerdict = CreateDictionary(); + layers = CreateSparseArray(); + + objectPositions = Self._property:ObjectPositions; + + if (objectPositions.PropertyExists(staffnum) = False) + { + objectPositions[staffnum] = CreateDictionary(); + } + + staffObjectPositions = objectPositions[staffnum]; + + score = Self._property:ActiveScore; + this_staff = score.NthStaff(staffnum); + bar = this_staff[measurenum]; + + for each bobj in bar + { + voicenumber = bobj.VoiceNumber; + + if (staffObjectPositions.PropertyExists(bar.BarNumber) = False) + { + staffObjectPositions[bar.BarNumber] = CreateDictionary(); + } + + barObjectPositions = staffObjectPositions[bar.BarNumber]; + + if (layerdict.PropertyExists(voicenumber)) + { + l = layerdict[voicenumber]; + } + else + { + if (voicenumber != 0) + { + l = libmei.Layer(); + layers.Push(l._id); + + if (barObjectPositions.PropertyExists(voicenumber) = False) + { + barObjectPositions[voicenumber] = CreateDictionary(); + } + + layerdict[voicenumber] = l; + libmei.AddAttribute(l, 'n', voicenumber); + } + } + + obj = null; + line = null; + parent = null; + beam = null; + tuplet = null; + + switch (bobj.Type) + { + case('Clef') + { + clef = GenerateClef(bobj); + libmei.AddChild(l, clef); + } + case('NoteRest') + { + note = GenerateNoteRest(bobj); + + // record the position of this element + objVoice = barObjectPositions[voicenumber]; + objVoice[bobj.Position] = note._id; + + if (note._property:TieIds != null) + { + ties = note._property:TieIds; + mties = Self._property:MeasureTies; + mties = mties.Concat(ties); + Self._property:MeasureTies = mties; + } + + beam = ProcessBeam(bobj, l); + tuplet = ProcessTuplet(bobj, note, l); + + if (beam != null) + { + libmei.AddChild(beam, note); + + if (tuplet != null) + { + if (beam._parent != tuplet._id) + { + libmei.AddChild(tuplet, beam); + } + + if (tuplet._parent != l._id) + { + libmei.AddChild(l, tuplet); + } + } + else + { + if (beam._parent != l._id) + { + libmei.AddChild(l, beam); + } + } + } + else + { + if (tuplet != null) + { + libmei.AddChild(tuplet, note); + + if (tuplet._parent != l._id) + { + libmei.AddChild(l, tuplet); + } + } + else + { + libmei.AddChild(l, note); + } + } + + } + case('BarRest') + { + brest = GenerateBarRest(bobj); + + if (brest != null) + { + libmei.AddChild(l, brest); + } + } + case('Slur') + { + line = GenerateLine(bobj); + } + case('CrescendoLine') + { + line = GenerateLine(bobj); + } + case('DimuendoLine') + { + line = GenerateLine(bobj); + } + case('OctavaLine') + { + line = GenerateLine(bobj); + } + case('Trill') + { + line = GenerateLine(bobj); + } + case('RepeatTimeLine') + { + RegisterVolta(bobj); + } + case('Line') + { + line = GenerateLine(bobj); + } + } + + if (line != null) + { + mlines = Self._property:MeasureLines; + mlines.Push(line._id); + Self._property:MeasureLines = mlines; + } + } + + for each LyricItem lobj in bar + { + ProcessLyric(lobj, objectPositions); + } + + for each SymbolItem sobj in bar + { + ProcessSymbol(sobj, objectPositions); + } + + return layers; +} //$end + +function GenerateClef (bobj) { + //$module(ExportGenerators.mss) + clefinfo = ConvertClef(bobj.StyleId); + clef_el = libmei.Clef(); + + libmei.AddChild(l, clef_el); + + libmei.AddAttribute(clef_el, 'shape', clefinfo[0]); + libmei.AddAttribute(clef_el, 'line', clefinfo[1]); + libmei.AddAttribute(clef_el, 'dis', clefinfo[2]); + libmei.AddAttribute(clef_el, 'dis.place', clefinfo[3]); + + return clef_el; +} //$end + +function GenerateNoteRest (bobj, layer) { + //$module(ExportGenerators.mss) + nr = null; + switch(bobj.NoteCount) + { + case(0) + { + nr = GenerateRest(bobj); + } + case(1) + { + nobj = bobj[0]; + nr = GenerateNote(nobj); + } + default + { + nr = GenerateChord(bobj); + } + } + + if (bobj.Dx != 0) + { + libmei.AddAttribute(nr, 'ho', ConvertOffsets(bobj.Dx)); + } + + if (bobj.CueSize = true and libmei.GetName(nr) != 'space') + { + libmei.AddAttribute(nr, 'size', 'cue'); + } + + if (bobj.Hidden = true and libmei.GetName(nr) != 'space') + { + libmei.AddAttribute(nr, 'visible', 'false'); + } + + if (bobj.Color != 0) + { + nrest_color = ConvertColor(bobj); + libmei.AddAttribute(nr, 'color', nrest_color); + } + + if (bobj.GraceNote = true) + { + libmei.addAttribute(nr, 'grace', 'acc'); + } + + if (bobj.IsAppoggiatura = true) + { + libmei.AddAttribute(nr, 'ornam', 'A'); + } + + if (bobj.IsAcciaccatura = true) + { + libmei.AddAttribute(nr, 'ornam', 'a'); + } + + if (bobj.GetArticulation(PauseArtic)) + { + fermata = libmei.Fermata(); + libmei.AddAttribute(fermata, 'form', 'norm'); + libmei.AddAttribute(fermata, 'shape', 'curved'); + libmei.AddChild(nr, fermata); + } + + if (bobj.GetArticulation(TriPauseArtic)) + { + fermata = libmei.Fermata(); + libmei.AddAttribute(fermata, 'form', 'norm'); + libmei.AddAttribute(fermata, 'shape', 'angular'); + libmei.AddChild(nr, fermata); + } + + if (bobj.GetArticulation(SquarePauseArtic)) + { + fermata = libmei.Fermata(); + libmei.AddAttribute(fermata, 'form', 'norm'); + libmei.AddAttribute(fermata, 'shape', 'square'); + libmei.AddChild(nr, fermata); + } + + if (bobj.GetArticulation(StaccatoArtic)) + { + libmei.AddAttributeValue(nr, 'artic', 'stacc'); + } + + if (bobj.GetArticulation(DownBowArtic)) + { + libmei.AddAttributeValue(nr, 'artic', 'dnbow'); + } + + if (bobj.GetArticulation(UpBowArtic)) + { + libmei.AddAttributeValue(nr, 'artic', 'upbow'); + } + + if (bobj.GetArticulation(MarcatoArtic)) + { + libmei.AddAttributeValue(nr, 'artic', 'marc'); + } + + if (bobj.GetArticulation(AccentArtic)) + { + libmei.addAttributeValue(nr, 'artic', 'acc'); + } + + if (bobj.GetArticulation(TenutoArtic)) + { + libmei.AddAttributeValue(nr, 'artic', 'ten'); + } + + if (bobj.GetArticulation(StaccatissimoArtic)) + { + libmei.AddAttributeValue(nr, 'artic', 'stacciss'); + } + + if (bobj.GetArticulation(StaccatissimoArtic)) + { + libmei.AddAttributeValue(nr, 'artic', 'stacciss'); + } + + if (bobj.GetArticulation(PlusArtic)) + { + libmei.AddAttributeValue(nr, 'artic', 'stop'); + } + + if (bobj.FallType = FallTypeDoit) + { + libmei.AddAttributeValue(nr, 'artic', 'doit'); + } + + if (bobj.FallType = FallTypeNormal) + { + libmei.AddAttributeValue(nr, 'artic', 'fall'); + } + + if (bobj.ScoopType = ScoopTypePlop) + { + libmei.AddAttributeValue(nr, 'artic', 'plop'); + } + + // a tremolo is a parent of note or chord in MEI + if ((bobj.SingleTremolos > 0) or (bobj.SingleTremolos = -1)) + { + btrem = libmei.BTrem(); + libmei.AddChild(btrem, nr); + + if (bobj.SingleTremolos = ZOnStem) + { + stemmod = 'z'; + } + else + { + stemmod = bobj.SingleTremolos & 'slash'; + } + + libmei.AddAttribute(nr, 'stem.mod', stemmod); + + return btrem; + } + + return nr; +} //$end + +function GenerateRest (bobj) { + //$module(ExportGenerators.mss) + // check if it's a rest + // check if it's hidden, in which case make MEI instead of + dur = bobj.Duration; + meidur = ConvertDuration(dur); + + if (bobj.Hidden) + { + r = libmei.Space(); + } + else + { + r = libmei.Rest(); + } + + libmei.AddAttribute(r, 'dur', meidur[0]); + libmei.AddAttribute(r, 'dur.ges', dur & 'p'); + libmei.AddAttribute(r, 'dots', meidur[1]); + + if (bobj.Dx != 0) + { + libmei.AddAttribute(r, 'ho', ConvertOffsets(bobj.Dx)); + } + + if (bobj.Dy != 0) + { + libmei.AddAttribute(r, 'vo', ConvertOffsets(bobj.Dy)); + } + + if (bobj.CueSize = true and libmei.GetName(r) != 'space') + { + libmei.AddAttribute(r, 'size', 'cue'); + } + + if (bobj.Hidden = true and libmei.GetName(r) != 'space') + { + libmei.AddAttribute(r, 'visible', 'false'); + } + + if (bobj.Color != 0) + { + nrest_color = ConvertColor(bobj); + libmei.AddAttribute(r, 'color', nrest_color); + } + + if (bobj.GetArticulation(PauseArtic)) + { + libmei.AddAttribute(r, 'fermata', 'above'); + } + + return r; +} //$end + +function GenerateNote (nobj) { + //$module(ExportGenerators.mss) + dur = nobj.ParentNoteRest.Duration; + meidur = ConvertDuration(dur); + ntinfo = ConvertDiatonicPitch(nobj.DiatonicPitch); + pos = nobj.ParentNoteRest.Position; + keysig = nobj.ParentNoteRest.ParentBar.GetKeySignatureAt(pos); + + n = libmei.Note(); + hash = SimpleNoteHash(nobj); + n._property:hash = hash; + + libmei.AddAttribute(n, 'pnum', nobj.Pitch); + libmei.AddAttribute(n, 'pname', ntinfo[0]); + libmei.AddAttribute(n, 'oct', ntinfo[1]); + libmei.AddAttribute(n, 'dur', meidur[0]); + libmei.AddAttribute(n, 'dur.ges', dur & 'p'); + libmei.AddAttribute(n, 'dots', meidur[1]); + + // Accidentals will always be encoded as child elements, not attributes + staff = nobj.ParentNoteRest.ParentBar.ParentStaff.StaffNum; + + if (nobj.NoteStyle != NormalNoteStyle) + { + nstyle = ConvertNoteStyle(nobj.NoteStyle); + libmei.AddAttribute(n, 'headshape', nstyle); + } + + accid = ConvertAccidental(nobj, keysig.Sharps); + accVal = accid[0]; + isVisible = accid[1]; + + if (accVal != ' ') + { + child = libmei.Accid(); + libmei.AddChild(n, child); + + if (isVisible = True) + { + libmei.AddAttribute(child, 'accid', accVal); + } + else + { + libmei.AddAttribute(child, 'accid.ges', accVal); + } + + switch (nobj.AccidentalStyle) + { + case (CautionaryAcc) + { + libmei.AddAttribute(child, 'func', 'caution'); + } + case (BracketedAcc) + { + libmei.AddAttribute(child, 'enclose', 'paren'); + } + } + } + + /* + Ties + */ + tieresolver = Self._property:TieResolver; + if (tieresolver.PropertyExists(hash)) + { + // this note is the end of the tie. + tie_id = tieresolver[hash]; + tie = libmei.getElementById(tie_id); + libmei.AddAttribute(tie, 'endid', '#' & n._id); + } + + if (nobj.Tied = True) + { + // set the end hash + parent_nr = nobj.ParentNoteRest; + next_object = parent_nr.NextItem(parent_nr.VoiceNumber, 'NoteRest'); + + if (next_object = null) + { + // check the first object in the next bar + next_bar_num = parent_nr.ParentBar.BarNumber + 1; + next_bar = parent_nr.ParentBar.ParentStaff.NthBar(next_bar_num); + next_object = next_bar.NthBarObject(0); + } + + for each next_note in next_object + { + if (nobj.Pitch = next_note.Pitch) + { + // it's probably this one. + endhash = SimpleNoteHash(next_note); + tie = libmei.Tie(); + libmei.AddAttribute(tie, 'startid', '#' & n._id); + tieresolver[endhash] = tie._id; + + n._property:TieIds = CreateSparseArray(tie._id); + } + } + } + + return n; +} //$end + +function GenerateChord (bobj) { + //$module(ExportGenerators.mss) + n = libmei.Chord(); + dur = bobj.Duration; + meidur = ConvertDuration(dur); + + libmei.AddAttribute(n, 'dur', meidur[0]); + libmei.AddAttribute(n, 'dur.ges', dur & 'p'); + libmei.AddAttribute(n, 'dots', meidur[1]); + + tiearr = CreateSparseArray(); + + for each note in bobj + { + sn = GenerateNote(note); + libmei.AddChild(n, sn); + + if (sn._property:TieIds != null) + { + tieids = sn._property:TieIds; + tiearr = tiearr.Concat(tieids); + } + } + + n._property:TieIds = tiearr; + + return n; +} //$end + +function GenerateBarRest (bobj) { + //$module(ExportGenerators.mss) + switch (bobj.RestType) + { + case (WholeBarRest) + { + obj = libmei.MRest(); + } + case (OneBarRepeat) + { + obj = libmei.MRpt(); + } + case (TwoBarRepeat) + { + obj = libmei.MRpt2(); + } + case (FourBarRepeat) + { + warnings = Self._property:warnings; + warnings.Push(utils.Format(_ObjectHasNoMEISupport, 'A four-bar repeat')); + return null; + } + } + + if (bobj.Hidden = true) + { + libmei.AddAttribute(obj, 'visible', 'false'); + } + + return obj; +} //$end + +function GenerateScoreDef (score) { + //$module(ExportGenerators.mss) + scoredef = libmei.ScoreDef(); + Self._property:_GlobalScoreDef = libmei.GetId(scoredef); + + docSettings = score.DocumentSetup; + + // this will ensure that the units specified by the user is the one that is + // represented in the output. + sibUnits = docSettings.UnitsInDocumentSetupDialog; + unit = ''; + + switch(sibUnits) + { + case(DocumentSetupUnitsInches) + { + unit = 'in'; + } + case(DocumentSetupUnitsPoints) + { + unit = 'pt'; + } + default + { + // Millimeters is the default for Sibelius + unit = 'mm'; + } + } + + libmei.AddAttribute(scoredef, 'page.width', docSettings.PageWidth & unit); + libmei.AddAttribute(scoredef, 'page.height', docSettings.PageHeight & unit); + libmei.AddAttribute(scoredef, 'page.leftmar', docSettings.PageLeftMargin & unit); + libmei.AddAttribute(scoredef, 'page.rightmar', docSettings.PageRightMargin & unit); + libmei.AddAttribute(scoredef, 'page.topmar', docSettings.PageTopMargin & unit); + libmei.AddAttribute(scoredef, 'page.botmar', docSettings.PageBottomMargin & unit); + + showCautionaryAccidentals = score.EngravingRules.CautionaryNaturalsInKeySignatures; + if (showCautionaryAccidentals = true) + { + libmei.AddAttribute(scoredef, 'key.sig.showchange', 'true'); + } + + systf = score.SystemStaff; + timesig = systf.CurrentTimeSignature(1); + + libmei.AddAttribute(scoredef, 'meter.count', timesig.Numerator); + libmei.AddAttribute(scoredef, 'meter.unit', timesig.Denominator); + libmei.AddAttribute(scoredef, 'meter.sym', ConvertNamedTimeSignature(timesig.Text)); + libmei.AddAttribute(scoredef, 'ppq', '256'); // sibelius' internal ppq. + + staffgrp = GenerateStaffGroups(score); + libmei.AddChild(scoredef, staffgrp); + + return scoredef; +} //$end + +function GenerateStaffGroups (score) { + //$module(ExportGenerators.mss) + staffdict = CreateDictionary(); + parentstgrp = libmei.StaffGrp(); + numstaff = score.StaffCount; + + for each Staff s in score + { + std = libmei.StaffDef(); + libmei.XMLIdToObjectMap[std._id] = s; + + libmei.AddAttribute(std, 'n', s.StaffNum); + libmei.AddAttribute(std, 'label', s.FullInstrumentName); + libmei.AddAttribute(std, 'lines', s.InitialInstrumentType.NumStaveLines); + + clefinfo = ConvertClef(s.InitialClefStyleId); + libmei.AddAttribute(std, 'clef.shape', clefinfo[0]); + libmei.AddAttribute(std, 'clef.line', clefinfo[1]); + libmei.AddAttribute(std, 'clef.dis', clefinfo[2]); + libmei.AddAttribute(std, 'clef.dis.place', clefinfo[3]); + libmei.AddAttribute(std, 'key.sig', ConvertKeySignature(s.InitialKeySignature.Sharps)); + + if (s.InitialKeySignature.Major) + { + libmei.AddAttribute(std, 'key.mode', 'major'); + } + else + { + libmei.AddAttribute(std, 'key.mode', 'minor'); + } + + staffdict[s.StaffNum] = std; + } + + stgpdict = CreateDictionary(); + stgprevidx = CreateDictionary(); + stgpnum = 1; + brackets = score.BracketsAndBraces; + + for each bkt in brackets + { + stgp = libmei.StaffGrp(); + libmei.AddAttribute(stgp, 'symbol', ConvertBracket(bkt.BracketType)); + libmei.AddAttribute(stgp, 'n', stgpnum); + stgpdict[stgpnum] = stgp; + + if (bkt.BracketType != BracketSub) + { + for i = bkt.TopStaveNum to bkt.BottomStaveNum + 1 + { + libmei.AddChild(stgp, staffdict[i]); + stgprevidx[i] = stgpnum; + } + } + stgpnum = stgpnum + 1; + } + + // finally, we need to put them all in the right order. + stgpnum_added = CreateSparseArray(); + for j = 1 to numstaff + 1 + { + if (stgprevidx.PropertyExists(j)) + { + // there is a group + stgpnum = stgprevidx[j]; + if (utils.IsInArray(stgpnum_added, stgpnum) = false) + { + libmei.AddChild(parentstgrp, stgpdict[stgpnum]); + stgpnum_added.Push(stgpnum); + } + } + else + { + libmei.AddChild(parentstgrp, staffdict[j]); + } + + } + return parentstgrp; +} //$end + +function GenerateLine (bobj) { + //$module(ExportGenerators.mss) + line = null; + bar = bobj.ParentBar; + + switch (bobj.Type) + { + case ('Slur') + { + line = libmei.Slur(); + slurrend = ConvertSlurStyle(bobj.StyleId); + libmei.AddAttribute(line, 'rend', slurrend[1]); + } + case ('CrescendoLine') + { + line = libmei.Hairpin(); + libmei.AddAttribute(line, 'form', 'cres'); + } + case ('DimuendoLine') + { + line = libmei.Hairpin(); + libmei.AddAttribute(line, 'form', 'dim'); + } + case ('OctavaLine') + { + line = libmei.Octave(); + octrend = ConvertOctava(bobj.StyleId); + libmei.AddAttribute(octl, 'dis', octrend[0]); + libmei.AddAttribute(octl, 'dis.place', octrend[1]); + } + case ('Trill') + { + line = GenerateTrill(bobj); + // NB: Return here since the trill already has its properties set. + return line; + } + case ('Line') + { + // a generic line element. + linecomps = MSplitString(bobj.StyleId, '.'); + switch(linecomps[2]) + { + case('bracket') + { + line = libmei.Line(); + libmei.AddAttribute(line, 'type', 'bracket'); + if (linecomps.Length > 4) + { + if (linecomps[4] = 'start') + { + libmei.AddAttribute(line, 'subtype', 'start'); + } + + if (linecomps[4] = 'end') + { + libmei.AddAttribute(line, 'subtype', 'end'); + } + } + } + } + } + } + + if (line = null) + { + return null; + } + + line = AddBarObjectInfoToElement(bobj, line); + + return line; +} //$end + + +function GenerateTrill (bobj) { + //$module(ExportGenerators.mss) + /* There are two types of trills in Sibelius: A line object and a + symbol object. This method normalizes both of these. + */ + trill = libmei.Trill(); + voicenum = bobj.VoiceNumber; + bar = bobj.ParentBar; + + if (voicenum = 0) + { + warnings = Self._property:warnings; + warnings.Push(utils.Format(_ObjectAssignedToAllVoicesWarning, bobj.Type)); + voicenum = 1; + } + + obj = GetNoteObjectAtPosition(bobj); + + if (obj != null) + { + libmei.AddAttribute(trill, 'startid', '#' & obj._id); + } + + trill = AddBarObjectInfoToElement(bobj, trill); + + return trill; +} //$end \ No newline at end of file diff --git a/src/ExportProcessors.mss b/src/ExportProcessors.mss new file mode 100644 index 0000000..b3bbd36 --- /dev/null +++ b/src/ExportProcessors.mss @@ -0,0 +1,453 @@ +function ProcessScore () { + //$module(ExportProcessors.mss) + // processors are a bit like a workflow manager -- they orchestrate the + // generators, which in turn use the converters to convert specific values from sibelius + // to MEI. + score = Self._property:ActiveScore; + + mei = libmei.Mei(); + libmei.setDocumentRoot(mei); + + libmei.AddAttribute(mei, 'xmlns:xlink', 'http://www.w3.org/1999/xlink'); + libmei.AddAttribute(mei, 'xmlns', 'http://www.music-encoding.org/ns/mei'); + libmei.AddAttribute(mei, 'meiversion', '2013'); + + header = sibmei2.GenerateMEIHeader(); + libmei.AddChild(mei, header); + + music = sibmei2.GenerateMEIMusic(); + libmei.AddChild(mei, music); + +} //$end + +function ProcessBeam (bobj, layer) { + //$module(ExportProcessors.mss) + next_obj = bobj.NextItem(bobj.VoiceNumber, 'NoteRest'); + ret = null; + + if (bobj.Duration < 256) + { + // if this object is an eighth note but is not beamed, and if the + // active beam is set, null out the active beam and return null. + if (bobj.Beam = NoBeam and layer._property:ActiveBeamId != null) + { + layer._property:ActiveBeamId = null; + return ret; + } + + /* + It's possible that Sibelius records a 'continue beam' at the start + of a beamed group. Visually, this doesn't look out of place if the previous + note was a quarter note or higher. + + The first check we do is if the note has a 'continue beam' attribute and + the previous note has a duration higher than 256 (quarter) then we probably have + a false negative (i.e., there is the start of a beam, but it isn't necessarily + encoded correctly). + */ + falseNegative = False; + + if (bobj.Beam = ContinueBeam and layer._property:ActiveBeamId = null) + { + // by all accounts this should be a beamed note, but we'll need to double-check. + prev_obj = bobj.PreviousItem(bobj.VoiceNumber, 'NoteRest'); + + if (prev_obj != null and (prev_obj.Duration >= 256)) + { + falseNegative = True; + } + } + + if (next_obj != null and (bobj.Beam = StartBeam or falseNegative = True) and next_obj.Beam = ContinueBeam) + { + // if: + // - we're not at the end of the bar + // - we have a start beam + // - the next note is a continue beam + beam = libmei.Beam(); + layer._property:ActiveBeamId = beam._id; + + // return the beam so that we can add it to the tree. + ret = beam; + } + + if (layer._property:ActiveBeamId != null and bobj.Beam = ContinueBeam) + { + // add the note to the beam, but return null + // so that we don't add it again to the tree. + beamid = layer._property:ActiveBeamId; + beam = libmei.getElementById(beamid); + + ret = beam; + } + } + else + { + if (layer._property:ActiveBeamId != null) + { + // this is a break in any active beam, so register it as such. + layer._property:ActiveBeamId = null; + } + } + + return ret; +} //$end + +function ProcessTuplet (bobj, meielement, layer) { + //$module(ExportProcessors.mss) + if (bobj.ParentTupletIfAny = null) + { + return null; + } + + if (layer._property:ActiveTupletId = null) + { + tupletObject = bobj.ParentTupletIfAny; + + tuplet = libmei.Tuplet(); + + layer._property:ActiveTupletObject = tupletObject; + layer._property:ActiveTupletId = tuplet._id; + + if (libmei.GetName(meielement) = 'beam') + { + // get the first child + startid = meielement.children[0]; + } + else + { + startid = meielement._id; + } + + libmei.AddAttribute(tuplet, 'startid', '#' & startid); + libmei.AddAttribute(tuplet, 'num', tupletObject.Left); + libmei.AddAttribute(tuplet, 'numbase', tupletObject.Right); + + tupletStyle = tupletObject.Style; + + switch (tupletStyle) + { + case(TupletNoNumber) + { + libmei.AddAttribute(tuplet, 'dur.visible', 'false'); + } + case(TupletLeft) + { + libmei.AddAttribute(tuplet, 'num.format', 'count'); + } + case(TupletLeftRight) + { + libmei.AddAttribute(tuplet, 'num.format', 'ratio'); + } + } + + tupletBracket = tupletObject.Bracket; + + switch(tupletBracket) + { + case(TupletBracketOff) + { + libmei.AddAttribute(tuplet, 'bracket.visible', 'false'); + } + } + + return tuplet; + + // used for tuplet spans... + // mlines = Self._property:MeasureLines; + // mlines.Push(tuplet._id); + } + else + { + tid = layer._property:ActiveTupletId; + t = libmei.getElementById(tid); + + if (IsLastNoteInTuplet(bobj)) + { + libmei.AddAttribute(t, 'endid', '#' & meielement._id); + layer._property:ActiveTupletObject = null; + layer._property:ActiveTupletId = null; + } + + return t; + } +} //$end + +function ProcessLyric (lyricobj, objectPositions) { + //$module(ExportProcessors.mss) + /* + We need to track initial, medial, and terminal lyrics. Sibelius + only allows us to know the medial and terminal, so we store all the + syllables in an array until we reach the end of the word, and then + attach them to the notes. + */ + styleparts = MSplitString(lyricobj.StyleId, '.'); + verse_id = styleparts[5]; + verse_id_arr = MSplitString(verse_id, false); + verse_num = verse_id_arr[5]; + bar_num = lyricobj.ParentBar.BarNumber; + staff_num = lyricobj.ParentBar.ParentStaff.StaffNum; + voicenum = lyricobj.VoiceNumber; + + if (voicenum = 0) + { + // assign it to the first voice, since we don't have any notes in voice 0. + voicenum = 1; + warnings = Self._property:warnings; + warnings.Push(utils.Format(_ObjectAssignedToAllVoicesWarning, bar_num, voicenum, 'Lyric object')); + } + + lyricwords = Self._property:LyricWords; + + if (lyricwords.PropertyExists(staff_num) = False) + { + lyricwords[staff_num] = CreateDictionary(); + } + + lyricstaff = lyricwords[staff_num]; + + if (lyricstaff.PropertyExists(voicenum) = False) + { + lyricstaff[voicenum] = CreateDictionary(); + } + + lyricvoice = lyricstaff[voicenum]; + + if (lyricvoice.PropertyExists(verse_num) = False) + { + lyricvoice[verse_num] = CreateSparseArray(); + } + + if (lyricobj.SyllableType = MiddleOfWord) + { + lyricvoice[verse_num].Push(lyricobj); + // we haven't reached the end of the word yet, so just return + // and keep going. + return null; + } + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // anything past here is in the EndOfWord condition. + // this should return a sparse array containing the syllables of the word. + lyricvoice[verse_num].Push(lyricobj); + lyric_word = lyricvoice[verse_num]; + objects = objectPositions[voicenum]; + + obj_id = null; + obj = null; + + for j = 0 to lyric_word.Length + { + syl = lyric_word[j]; + + verse = libmei.Verse(); + libmei.AddAttribute(verse, 'n', verse_num); + sylel = libmei.Syl(); + libmei.SetText(sylel, syl.Text); + libmei.AddChild(verse, sylel); + + if (j = 0) + { + libmei.AddAttribute(sylel, 'wordpos', 'i'); // 'initial' + } + else + { + if (syl.SyllableType = EndOfWord) + { + libmei.AddAttribute(sylel, 'wordpos', 't'); // 'terminal' + + if (syl.NumNotes > 1) + { + libmei.AddAttribute(sylel, 'con', 'u'); // 'underscore' + } + + } + else + { + libmei.AddAttribute(sylel, 'wordpos', 'm'); // medial + } + } + + obj = GetNoteObjectAtPosition(syl); + + if (obj != null) + { + name = libmei.GetName(obj); + + if (name = 'rest') + { + warnings = Self._property:warnings; + warnings.Push(utils.Format(_ObjectIsOnAnIllogicalObject, bar_num, voicenum, 'Lyric', 'rest')); + } + + if (name = 'chord') + { + warnings = Self._property:warnings; + warnings.Push(utils.Format(_ObjectIsOnAnIllogicalObject, bar_num, voicenum, 'Lyric', 'chord')); + } + + libmei.AddChild(obj, verse); + } + } + + // now reset the syllable array for this voice + lyricvoice[verse_num] = CreateSparseArray(); +} //$end + +function ProcessSystemStaff (score) { + //$module(ExportProcessors.mss) + systf = score.SystemStaff; + + for each bar in systf + { + for each bobj in bar + { + switch (bobj.Type) + { + case ('SpecialBarline') + { + spclbarlines = Self._property:SpecialBarlines; + spclbarlines[bar.BarNumber] = ConvertBarline(bobj.BarlineInternalType); + } + case ('SystemText') + { + systemtext = Self._property:SystemText; + + if (systemtext.PropertyExists(bar.BarNumber) = False) + { + systemtext[bar.BarNumber] = CreateSparseArray(); + } + + systemtext[bar.BarNumber].Push(bobj); + } + case ('RepeatTimeLine') + { + RegisterVolta(bobj); + } + } + } + } +} //$end + +function RegisterVolta (bobj) { + //$module(ExportProcessors.mss) + voltabars = Self._property:VoltaBars; + style = MSplitString(bobj.StyleId, '.'); + + if (style[2] = 'repeat') + { + voltabars[bobj.ParentBar.BarNumber] = bobj; + } +} //$end + +function ProcessVolta (mnum) { + //$module(ExportProcessors.mss) + voltabars = Self._property:VoltaBars; + + if (voltabars.PropertyExists(mnum)) + { + voltaElement = libmei.Ending(); + + // swap out the section as the parent for the ending + Self._property:VoltaElement = voltaElement; + + voltaObject = voltabars[mnum]; + voltainfo = ConvertEndingValues(voltaObject.StyleId); + + libmei.AddAttribute(voltaElement, 'n', voltainfo[0]); + libmei.AddAttribute(voltaElement, 'label', voltainfo[1]); + libmei.AddAttribute(voltaElement, 'type', voltainfo[2]); + + if (voltaObject.EndBarNumber != mnum) + { + Self._property:ActiveVolta = voltaObject; + } + + return voltaElement; + } + else + { + if (Self._property:ActiveVolta != null) + { + // we have an unresolved volta, so + // we'll keep the previous parentElement + // active. + activeVolta = Self._property:ActiveVolta; + voltaElement = Self._property:VoltaElement; + + // if the end bar is the current bar OR if the end + // bar is the next bar, but the end position is 0, we're escaping the + // volta the next time around. + if ((activeVolta.EndBarNumber = mnum) or + (activeVolta.EndBarNumber = (mnum + 1) and activeVolta.EndPosition = 0)) + { + Self._property:ActiveVolta = null; + Self._property:VoltaElement = null; + } + return null; + } + } + + return null; +} //$end + +function ProcessSymbol (sobj, objectPositions) { + //$module(ExportProcessors.mss) + Log('symbol index: ' & sobj.Index & ' name: ' & sobj.Name); + Log(sobj.VoiceNumber); + + switch (sobj.Index) + { + case ('32') + { + // trill + trill = GenerateTrill(sobj); + mlines = Self._property:MeasureLines; + mlines.Push(trill._id); + } + + case ('36') + { + // inverted mordent + mordent = libmei.Mordent(); + libmei.AddAttribute(mordent, 'form', 'inv'); + mlines = Self._property:MeasureLines; + mlines.Push(mordent._id); + } + + case ('37') + { + // mordent + mordent = libmei.Mordent(); + libmei.AddAttribute(mordent, 'form', 'norm'); + mlines = Self._property:MeasureLines; + mlines.Push(mordent._id); + } + + case ('38') + { + // turn + turn = libmei.Turn(); + libmei.AddAttribute(turn, 'form', 'norm'); + turn = AddBarObjectInfoToElement(sobj, turn); + mlines = Self._property:MeasureLines; + mlines.Push(turn._id); + } + + case ('39') + { + // inverted turn + turn = libmei.Turn(); + libmei.AddAttribute(turn, 'form', 'inv'); + turn = AddBarObjectInfoToElement(sobj, turn); + mlines = Self._property:MeasureLines; + mlines.Push(turn._id); + } + + case ('242') + { + // triple staccato + return null; + } + } +} //$end diff --git a/src/GLOBALS.mss b/src/GLOBALS.mss new file mode 100644 index 0000000..58b8daa --- /dev/null +++ b/src/GLOBALS.mss @@ -0,0 +1,18 @@ +Version "2.0.0" +PluginName "Sibmei2" +Author "Andrew Hankinson" + +_InitialProgressTitle "Exporting %s to MEI" +_ExportFileIsNull "You must specify a file to save." +_ScoreError "Please open a score and try again." +_ExportSuccess "The file was exported successfully." +_ExportFailure "The file was not exported because of an error." +_VersionNotSupported "Versions earlier than Sibelius 7 are not supported." +_ExportingBars "Exporting to MEI: Bar %s of %s" + +_ObjectAssignedToAllVoicesWarning "Bar %s, voice %s. %s assigned to all voices will be encoded on voice 1. If this is incorrect, you should explicitly assign the trill object to a voice." +_ObjectHasNoMEISupport "%s is not supported by MEI at this time." +_ObjectIsOnAnIllogicalObject "Bar %s, voice %s. %s is added to a %s object. This will create invalid MEI. You should fix this in your Sibelius file if possible, or edit your MEI file after export." + +LOGFILE "/tmp/sibelius.log" + diff --git a/src/Initialize.mss b/src/Initialize.mss new file mode 100644 index 0000000..9182719 --- /dev/null +++ b/src/Initialize.mss @@ -0,0 +1,8 @@ +function Initialize() { + if (Sibelius.FileExists(LOGFILE) = False) + { + Sibelius.CreateTextFile(LOGFILE); + } + + AddToPluginsMenu(PluginName,'Run'); +} //$end diff --git a/src/Run.mss b/src/Run.mss new file mode 100644 index 0000000..aff4658 --- /dev/null +++ b/src/Run.mss @@ -0,0 +1,65 @@ +function Run() { + //$module(Run.mss) + + // first, ensure we're running with a clean slate. + libmei.destroy(); + + // do some preliminary checks + if (Sibelius.ProgramVersion < 7000) + { + Sibelius.MessageBox(_VersionNotSupported); + return False; + } + + if (Sibelius.ScoreCount = 0) + { + Sibelius.MessageBox(_ScoreError); + return False; + } + + // Set up the warnings tracker + Self._property:warnings = CreateSparseArray(); + + // Ask to the file to be saved somewhere + filename = Sibelius.SelectFileToSave('Save as...', False, False, 'mei', 'TEXT', 'Music Encoding Initiative'); + + if (filename = null) + { + Sibelius.MessageBox(_ExportFileIsNull); + return False; + } + + // Deal with the Progress GUI + // set the active score here so we can refer to it throughout the plugin + Self._property:ActiveScore = Sibelius.ActiveScore; + + progCount = Sibelius.ActiveScore.SystemStaff.BarCount; + fn = utils.ExtractFileName(filename); + progressTitle = utils.Format(_InitialProgressTitle, fn); + Sibelius.CreateProgressDialog(progressTitle, 0, progCount - 1); + + // finally, process the score. + sibmei2.ProcessScore(); + + doc = libmei.getDocument(); + // save the file + export_status = libmei.meiDocumentToFile(doc, filename); + + // start cleaning up. + Sibelius.DestroyProgressDialog(); + + // display the warnings that were registered during the export process + for each warning in Self._property:warnings + { + trace('Warning: ' & warning); + } + + if (export_status = False) + { + Sibelius.MessageBox(_ExportFailure); + } + + // clean up after ourself + libmei.destroy(); + +} //$end diff --git a/src/Utilities.mss b/src/Utilities.mss new file mode 100644 index 0000000..191a5ce --- /dev/null +++ b/src/Utilities.mss @@ -0,0 +1,241 @@ +function MSplitString (string, delimiter) { + //$module(Utilities.mss) + /* + The default Splitstring method is buggy, + so I've re-implemented it here. + + Delimiter is optional; if it is false, this will + split the string into an array of characters. + */ + ret = CreateSparseArray(); + pos = 0; + // If there is no delimiter, split the string + // into an array of characters. + if (delimiter = false) + { + for i = 0 to Length(string) + { + ret.Push(Substring(string, i, 1)); + } + return ret; + } + + for i = 0 to Length(string) + 1 + { + if (utils.CharAt(string, i) = delimiter) + { + ret.Push(Substring(string, pos, i - pos)); + pos = i + 1; + } + + if (i = Length(string)) + { + ret.Push(Substring(string, pos, Length(string) - pos)); + } + } + return ret; +} //$end + +function PrevPow2 (val) { + //$module(Utilities.mss) + if (val = 0) + { + return 0; + } + //val = val - 1; + val = utils.bwOR(val, utils.shr(val, 1)); + val = utils.bwOR(val, utils.shr(val, 2)); + val = utils.bwOR(val, utils.shr(val, 4)); + val = utils.bwOR(val, utils.shr(val, 8)); + val = utils.bwOR(val, utils.shr(val, 16)); + // this might be a hack, but I wrote it in + // a power outage with no internet. + // we get the next power of two, and then + // divide by two to get the previous one. + val = (val + 1) / 2; + return val; +} //$end + +function SimpleNoteHash (nobj) { + //$module(Utilities.mss) + /* + Generate a simple note hash. Not guaranteed to be unique given + any suitably large sample of notes, but should be unique enough for quick + checks. + */ + pos = nobj.ParentNoteRest.Position; + pitch = nobj.Pitch; + duration = nobj.Duration; + voice = nobj.VoiceNumber; + name = nobj.Name; + parent_bar_number = nobj.ParentNoteRest.ParentBar.BarNumber; + parent_staff_number = nobj.ParentNoteRest.ParentBar.ParentStaff.StaffNum; + time = nobj.ParentNoteRest.Time; + + hash = '' & pos & '-' & pitch & '-' & duration & '-' & voice & '-' & name & '-' & parent_bar_number & '-' & parent_staff_number & '-' & time; + + return hash; + +} //$end + +function GetNoteObjectAtPosition (bobj) { + //$module(Utilities.mss) + // takes a dictionary of {pos:id} mappings for a given + // voice, and returns the NoteRest object. If one isn't found + // exactly at `position`, it will first look back (previous) + // and then look forward, for candidate objects. + + objectPositions = Self._property:ObjectPositions; + staff_num = bobj.ParentBar.ParentStaff.StaffNum; + bar_num = bobj.ParentBar.BarNumber; + voice_num = bobj.VoiceNumber; + + staffObjectPositions = objectPositions[staff_num]; + barObjectPositions = staffObjectPositions[bar_num]; + voiceObjectPositions = barObjectPositions[voice_num]; + + if (voiceObjectPositions.PropertyExists(bobj.Position)) + { + obj_id = voiceObjectPositions[bobj.Position]; + obj = libmei.getElementById(obj_id); + return obj; + } + else + { + // if we can't find anything at this position, + // find the previous and subsequent objects, and align the + // lyrics with them. + prev_obj = bobj.PreviousItem(voice_num, 'NoteRest'); + + if (prev_obj != null) + { + // there should be an object registered here + obj_id = voiceObjectPositions[prev_obj.Position]; + obj = libmei.getElementById(obj_id); + return obj; + } + else + { + next_obj = bobj.NextItem(voice_num, 'NoteRest'); + + if (next_obj != null) + { + obj_id = voiceObjectPositions[next_obj.Position]; + obj = libmei.getElementById(obj_id); + return obj; + } + } + } + + return null; +} //$end + +function AddBarObjectInfoToElement (bobj, element) { + //$module(Utilities.mss) + /* + adds timing and position info (startids, endids, tstamps, etc.) to an element + This info is mostly derived from the base BarObject class. + */ + voicenum = bobj.VoiceNumber; + bar = bobj.ParentBar; + + if (bobj.Type = 'Line') + { + // lines have durations, but symbols do not. + libmei.AddAttribute(element, 'dur.ges', bobj.Duration & 'p'); + } + + libmei.AddAttribute(element, 'tstamp', ConvertPositionToTimestamp(bobj.Position, bobj.ParentBar)); + + if (bobj.Type = 'Line') + { + libmei.AddAttribute(element, 'tstamp2', ConvertPositionToTimestamp(bobj.EndPosition, bar)); + } + + libmei.AddAttribute(element, 'staff', bar.ParentStaff.StaffNum); + libmei.AddAttribute(element, 'layer', voicenum); + + if (bobj.Dx > 0) + { + libmei.AddAttribute(element, 'ho', ConvertOffsets(bobj.Dx)); + } + + if (bobj.Dy > 0) + { + libmei.AddAttribute(element, 'vo', ConvertOffsets(bobj.Dy)); + } + + return element; + +} //$end + +function TupletsEqual (t, t2) { + //$module(Utilities.mss) + + // shamelessly copied from the built-in tuplet plugin. + tIsBar = (t = null) or (t.Type = 'Bar'); + t2IsBar = (t2 = null) or (t2.Type = 'Bar'); + + if( tIsBar and t2IsBar ) { return true; } + if( tIsBar or t2IsBar ) { return false; } + + b = t.ParentBar; + b2 = t2.ParentBar; + + if( b.BarNumber != b2.BarNumber ) { return false; } + if( b.ParentStaff.StaffNum != b2.ParentStaff.StaffNum ) { return 0; } + if( t.VoiceNumber != t2.VoiceNumber ) { return false; } + + if( t.Position != t2.Position ) { return false; } + if( t.PlayedDuration != t2.PlayedDuration ) { return false; } + + return true; + +} //$end + +function IsLastNoteInTuplet (bobj) { + //$module(Utilities.mss) + if (bobj.ParentTupletIfAny = null) + { + return false; + } + + tuplet = bobj.ParentTupletIfAny; + + if (bobj.PositionInTuplet >= tuplet.Duration) + { + return true; + } + + return false; + +} //$end + +function lstrip (str) { + //$module(Utilities.mss) + if (utils.CharAt(str, 0) = ' ') + { + return Substring(str, 1); + } + else + { + return str; + } +} //$end + +function rstrip (str) { + //$module(Utilities.mss) + if (utils.CharAt(str, Length(str) - 1) = ' ') + { + return Substring(str, 0, Length(str) - 1); + } + else + { + return str; + } +} //$end + +function Log (message) { + //$module(Utilities.mss) + Sibelius.AppendLineToFile(LOGFILE, message, True); +} //$end \ No newline at end of file diff --git a/test/GLOBALS.mss b/test/GLOBALS.mss new file mode 100644 index 0000000..6c6ff5b --- /dev/null +++ b/test/GLOBALS.mss @@ -0,0 +1 @@ +_SibTestFileDirectory "/Users/ahankins/Documents/code/git/sibelius/sibmei2/sibs/" \ No newline at end of file diff --git a/test/Initialize.mss b/test/Initialize.mss new file mode 100644 index 0000000000000000000000000000000000000000..341adcc6bd8047fa8ecaf25c2ad4d0ea6ab49200 GIT binary patch literal 78 zcmezWFO8v;A&()Mp@bomAs@(6VDJQznP7e*Lk^Ht#gNLN!JrA0sb=5;k_rsgK)M#p Q(r3_TPyx#4F{A*+0Gr+okpKVy literal 0 HcmV?d00001 diff --git a/test/Run.mss b/test/Run.mss new file mode 100644 index 0000000000000000000000000000000000000000..2ce32b3b5bbef768b66e8bb2c71bd1d730b56e45 GIT binary patch literal 1612 zcmds%-Acni5QWcmpCW?L3X+1i;)RNcU_q=tKx=;t#I|&+2+~(qzu9EX##T%(l_g;_ zJ2U6ZnVo#RPxP#r9<)-XIlDx+-qO(l`!}_CCt4`SI>l!u$M*?OpRb|DoMfCirMjtk z9TQtbXPV&OA$AUq?dthboqOz+1|>pAZQYUE;opXdt%{8?+C=Ype@BifyE8Jrg4Fh` z##kNJq|9$fIV&OmqqhgNdaZjN-6}CmTNh-_h>B}9t%A?`t7?ZT=4q&=S3pSN9!`wk z_ev7=K)EWh7SyryS(f-7V(pVLM^W255QciflIf^qQE;u$EAFXIHDdM1If6q@T&%R! z7VwIWyx 0), 'There should be elements in the MEI Document Tree'); + assert.True((f.GetPropertyNames().Length > 0), 'There should be elements in the Flattened MEI Structure'); + + libmei.destroy(); + + t = libmei._property:MEIDocument; + f = libmei._property:MEIFlattened; + assert.False((t.Length > 0), 'There should not be elements in the MEI Document Tree'); + assert.False((f.GetPropertyNames().Length > 0), 'There should not be elements in the Flattened MEI Structure'); + + libmei.destroy(); +} //$end + +function TestGetElementByName (assert, plugin) { + //$module(TestLibmei.mss) + root = libmei.Mei(); + libmei.setDocumentRoot(root); + + head = libmei.CreateElement('meiHead', 'm-head'); + music = libmei.CreateElement('music', 'm-music'); + libmei.AddChild(root, head); + libmei.AddChild(root, music); + + s = libmei.getElementById('m-music'); + assert.NotNull(s, 'The music element should not be null'); + + libmei.destroy(); +} //$end + +function TestMEIXMLOutput (assert, plugin) { + //$module(TestLibmei.mss) + mei = libmei.Mei(); + meiHead = libmei.MeiHead(); + music = libmei.Music(); + + libmei.setDocumentRoot(mei); + libmei.AddChild(mei, meiHead); + libmei.AddChild(mei, music); + + d = libmei._property:MEIDocument; + m = libmei.meiDocumentToString(d); + + assert.NotNull(m, 'The MEI Document output should not be null'); + libmei.destroy(); +} //$end + +function TestMEIFileWriting (assert, plugin) { + //$module(TestLibmei.mss) + + libmei.destroy(); + + mei = libmei.Mei(); + meiHead = libmei.MeiHead(); + music = libmei.Music(); + + libmei.setDocumentRoot(mei); + libmei.AddChild(mei, meiHead); + libmei.AddChild(mei, music); + + d = libmei.getDocument(); + m = libmei.meiDocumentToFile(d, '/tmp/foo.mei'); + + assert.True(m, 'The MEI File was successfully written to /tmp/foo.mei.'); + + libmei.destroy(); +} //$end + +function TestRemoveKeyFromDictionary (assert, plugin) { + //$module(TestLibmei.mss) + d = CreateDictionary('foo', 'bar', 'bif', 'baz'); + assert.True(d.PropertyExists('foo'), 'The property foo should exist'); + + dprime = libmei.removeKeyFromDictionary(d, 'foo'); + assert.False(dprime.PropertyExists('foo'), 'The property foo should no longer exist'); +} //$end + +function TestGetSetId (assert, plugin) { + //$module(TestLibmei.mss) + el = libmei.Mei(); + id = libmei.GetId(el); + assert.NotNull(id, 'The ID should not be null'); + + inDocument = libmei.getElementById(id); + assert.NotNull(inDocument, 'The ID should be in the MEI Document'); + + libmei.SetId(el, 'newId'); + inDocument = libmei.getElementById(id); + assert.Null(inDocument, 'The old ID key should return a null when a new ID has been set.'); + newInDocument = libmei.getElementById('newId'); + assert.NotNull(newInDocument, 'The new ID should return the object'); + + libmei.destroy(); +} //$end diff --git a/test/TestUtilities.mss b/test/TestUtilities.mss new file mode 100644 index 0000000..14023b3 --- /dev/null +++ b/test/TestUtilities.mss @@ -0,0 +1,27 @@ +function TestUtilities (suite) { + //$module(TestUtilities) + suite + .Add('TestMSplitString') + .Add('TestPrevPow2') + ; +} //$end + + +function TestMSplitString (assert, plugin) { + //$module(TestUtilities) + split = sibmei2.MSplitString('foo.bar.baz', '.'); + assert.Equal(split.Length, 3, 'There should be three elements in the split string'); + assert.Equal(split[0], 'foo', 'The first element should be foo'); +} //$end + +function TestPrevPow2 (assert, plugin) { + //$module(TestUtilities) + pow = sibmei2.PrevPow2(1025); + assert.Equal(pow, 1024, 'Previous Power of two of 1025 is 1024'); + + pow = sibmei2.PrevPow2(8); + assert.Equal(pow, 8, 'Previous Power of two of 8 is 8'); + + pow = sibmei2.PrevPow2(7); + assert.Equal(pow, 4, 'Previous Power of two of 7 is 4'); +} //$end