mandioca-tabs-mcp 0.2.16 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.mjs +1654 -32
- package/package.json +1 -1
package/index.mjs
CHANGED
|
@@ -16490,6 +16490,12 @@ var init_atajos = __esm({
|
|
|
16490
16490
|
{ id: "multipista", nombre: "Ver todas las pistas", grupo: "Vista y pistas" },
|
|
16491
16491
|
{ id: "una-pista", nombre: "Ver una sola pista", grupo: "Vista y pistas" },
|
|
16492
16492
|
{ id: "anacruza", nombre: "Anacruza ac\xE1", grupo: "Compases" },
|
|
16493
|
+
// ★ La voz del cursor (2026-11-10). Sin tecla de fábrica: Alt+número está inerte a propósito.
|
|
16494
|
+
{ id: "voz-1", nombre: "Escribir en la voz 1", grupo: "Escribir notas" },
|
|
16495
|
+
{ id: "voz-2", nombre: "Escribir en la voz 2", grupo: "Escribir notas" },
|
|
16496
|
+
{ id: "voz-3", nombre: "Escribir en la voz 3", grupo: "Escribir notas" },
|
|
16497
|
+
{ id: "voz-4", nombre: "Escribir en la voz 4", grupo: "Escribir notas" },
|
|
16498
|
+
{ id: "voz-siguiente", nombre: "Pasar a la voz siguiente", grupo: "Escribir notas" },
|
|
16493
16499
|
// ── ⛔⛔ EL MENÚ DE LA LÍNEA DIVISORIA, que faltaba (2026-09-01) ───────────────
|
|
16494
16500
|
//
|
|
16495
16501
|
// Estas cuatro se construyeron el 2026-09-01 con su menú, su modelo y sus cuatro
|
|
@@ -16598,6 +16604,9 @@ var init_atajos = __esm({
|
|
|
16598
16604
|
// ★ Agregado el 2026-09-03. Va en «Audio y mezcla» y no en un grupo propio porque es lo que
|
|
16599
16605
|
// uno prende para sincronizar a oído, junto al imán y a «oír el tramo».
|
|
16600
16606
|
{ id: "metronomo", nombre: "Metr\xF3nomo: marcar el pulso al reproducir", grupo: "Audio y mezcla" },
|
|
16607
|
+
// ★ Agregados el 2026-11-10 (práctica). Sin tecla de fábrica: cada uno se la pone.
|
|
16608
|
+
{ id: "bucle", nombre: "Bucle: repetir el pasaje marcado o el comp\xE1s del cursor", grupo: "Audio y mezcla" },
|
|
16609
|
+
{ id: "cuenta-previa", nombre: "Cuenta previa: un comp\xE1s de clics antes de entrar", grupo: "Audio y mezcla" },
|
|
16601
16610
|
{ id: "oir-tramo", nombre: "O\xEDr la grabaci\xF3n desde el comp\xE1s del cursor", grupo: "Audio y mezcla" },
|
|
16602
16611
|
{ id: "anclar", nombre: "Anclar el comp\xE1s del cursor a la grabaci\xF3n", grupo: "Audio y mezcla" },
|
|
16603
16612
|
{ id: "desanclar", nombre: "Soltar el comp\xE1s del cursor de la grabaci\xF3n", grupo: "Audio y mezcla" },
|
|
@@ -21631,6 +21640,22 @@ var init_barra = __esm({
|
|
|
21631
21640
|
principiante: "Prende o apaga un clic que marca el pulso mientras suena la obra. Prendido, aparece tambi\xE9n en el mezclador con su propio volumen.",
|
|
21632
21641
|
profesional: "Clic de metr\xF3nomo; volumen propio en el mezclador."
|
|
21633
21642
|
},
|
|
21643
|
+
"barra.bucle": {
|
|
21644
|
+
nombre: "Bucle",
|
|
21645
|
+
accion: "audio-bucle",
|
|
21646
|
+
principiante: "Repite una y otra vez el pasaje que marcaste, o el comp\xE1s del cursor si no marcaste nada. Al lado del bot\xF3n se ven los compases que se repiten.",
|
|
21647
|
+
profesional: "Loop del pasaje marcado o del comp\xE1s del cursor."
|
|
21648
|
+
},
|
|
21649
|
+
"barra.practica": {
|
|
21650
|
+
nombre: "Pr\xE1ctica",
|
|
21651
|
+
principiante: "Ajustes para practicar: un comp\xE1s de cuenta antes de que entre la m\xFAsica, y que la velocidad suba sola cada tantas vueltas del bucle hasta la que elijas. De f\xE1brica todo apagado.",
|
|
21652
|
+
profesional: "Count-in y speed trainer del bucle."
|
|
21653
|
+
},
|
|
21654
|
+
"barra.voz": {
|
|
21655
|
+
nombre: "Voz",
|
|
21656
|
+
principiante: "En qu\xE9 voz escribes. Una voz es una l\xEDnea mel\xF3dica dentro del mismo pentagrama: por ejemplo, el bajo en la voz 1 y la melod\xEDa en la voz 2, cada una con sus propias figuras. Lo que teclees va a la voz marcada.",
|
|
21657
|
+
profesional: "Voz del cursor (1\u20134)."
|
|
21658
|
+
},
|
|
21634
21659
|
"barra.selector-sigue": {
|
|
21635
21660
|
nombre: "El selector sigue a la reproducci\xF3n",
|
|
21636
21661
|
principiante: "Prendido, el cursor de escritura acompa\xF1a a la m\xFAsica mientras suena. Apagado, el cursor se queda donde lo pusiste, y cada vez que aprietas play vuelve a sonar el mismo pasaje: sirve para practicar una parte.",
|
|
@@ -22637,6 +22662,11 @@ var init_aspecto2 = __esm({
|
|
|
22637
22662
|
principiante: "Marcado, la partitura muestra al principio la afinaci\xF3n de cada cuerda.",
|
|
22638
22663
|
profesional: "Afinaci\xF3n en el pliego."
|
|
22639
22664
|
},
|
|
22665
|
+
"aspecto.diagramas": {
|
|
22666
|
+
nombre: "Diagramas de acordes",
|
|
22667
|
+
principiante: "Adem\xE1s del nombre (Am, G7\u2026), un cuadrito con los trastes de cada acorde: sobre la partitura o en una lista al comienzo. Salen de las notas que escribiste; si un nombre no est\xE1 escrito con notas en ning\xFAn lado, queda solo el nombre. De f\xE1brica, apagado.",
|
|
22668
|
+
profesional: "Chord diagrams: en la partitura o arriba. Forma tomada de lo escrito."
|
|
22669
|
+
},
|
|
22640
22670
|
"aspecto.restablecer": {
|
|
22641
22671
|
nombre: "Restablecer",
|
|
22642
22672
|
principiante: "Devuelve esta secci\xF3n a como ven\xEDa de f\xE1brica. Las dem\xE1s secciones no se tocan.",
|
|
@@ -23080,7 +23110,7 @@ function _usingCtx() {
|
|
|
23080
23110
|
}
|
|
23081
23111
|
};
|
|
23082
23112
|
}
|
|
23083
|
-
var __defProp2, __exportAll, ResizeObserverPolyfill, IntersectionObserverPolyfill, AlphaTabErrorType, AlphaTabError, VersionInfo, DynamicValue, MidiUtils, AutomationType, SyncPointData, Automation, BendPoint, BendStyle, BendType, BrushType, CrescendoType, Duration, GraceType, AccentuationType, Fingers, HarmonicType, NoteAccidentalMode, Ottavia, SlideInType, SlideOutType, Slur, SlurSegmentKind, VibratoType, TabRhythmMode, FingeringMode, NotationMode, NotationElement, NotationSettings, Lazy, LogLevel, ConsoleLogger, Logger, AccidentalType, Clef, SimileMark, ElementStyle, KeySignature, KeySignatureType, SustainPedalMarkerType, SustainPedalMarker, BarSubElement, BarStyle, BarLineStyle, Bar, TripletFeel, BeamingRules, MasterBar, BracketExtendMode, TrackNamePolicy, TrackNameMode, TrackNameOrientation, BarNumberDisplay, RenderStylesheet, RepeatGroup, GraceGroup, VoiceSubElement, VoiceStyle, Voice$1, TextAlign, TextBaseline, MeasuredText, CanvasHelper, ScoreSubElement, HeaderFooterStyle, ScoreStyle, Score, SynthConstants, TuningParseResult, TuningParseResultTone, ModelUtils, PickStroke, MusicFontSymbol, MusicFontSymbolLookup, TechniqueSymbolPlacement, InstrumentArticulation, PercussionMapper, NoteOrnament, NoteIdBag, NoteSubElement, NoteStyle, Note3, TupletGroup, WhammyType, GolpeType, FadeType, WahPedal, BarreShape, Rasgueado, TremoloPickingStyle, TremoloPickingEffect, BeatBeamingMode, BeatSubElement, BeatStyle, Beat, BendPointCloner, NoteCloner, SyncPointDataCloner, AutomationCloner, TremoloPickingEffectCloner, BeatCloner, AlphaTex1EnumMappings, AlphaTex1LanguageDefinitions, AlphaTexNodeType, AlphaTexDiagnosticsSeverity, AlphaTexDiagnosticCode, AlphaTexDiagnosticBag, AlphaTexAccidentalMode, AlphaTexVoiceMode, AlphaTexStaffNoteKind, ArgumentListParseTypesMode, TypeConversions, IOHelper, AlphaTexLexer, AlphaTexParseMode, AlphaTexParser, Atnf, AlphaTex1MetaDataReader, ApplyNodeResult, ApplyStructuralMetaDataResult, GeneralMidi, Chord3, FormatError, Color, FermataType, Fermata, Lyrics, Section, Tuning, Staff, PlaybackInformation, TrackSubElement, TrackStyle, Track, BeamDirection, AlphaTex1LanguageHandler, EndOfReaderError, OverflowError, ThrowingReadable, ScoreImporter, UnsupportedFormatError, ByteBuffer, AlphaTexErrorWithDiagnostics, AlphaTexImportState, AlphaTexImporter, Huffman$1, Found, NeedBit, NeedBits, HuffTools, InflateWindow, Inflate, ZipEntry, ZipReader, XmlNodeType, XmlNode, XmlError, XmlParser, XmlWriter, XmlDocument, DrawObject, TextDrawObject, GuitarDrawObject, SlurDrawObject, WavyLineDrawObject, TupletBracketDrawObject, WedgeDrawObject, VoltaDrawObject, OctaveClefDrawObject, TrillDrawObject, StaffLayout, Bracket, CapellaVoiceState, CapellaParser, CapellaImporter, Direction, Gp3To5Importer, GpBinaryHelpers, MixTableChange, Bounds, BinaryStylesheet, BackingTrack, GpifRhythm, GpifSound, GpifParser, PartConfigurationScoreView, PartConfigurationTrackViewGroup, PartConfiguration, LayoutConfigurationScoreView, LayoutConfigurationTrackViewGroup, LayoutConfiguration, Gp7To8Importer, BitReader, GpxFile, GpxFileSystem, GpxImporter, BeatSteps, AccidentalHelper, StaffContext, InstrumentArticulationWithPlaybackInfo, TrackInfo, MusicXmlImporter, LayoutMode, EventEmitter, EventEmitterOfT, AlphaSynthWebAudioSynthOutputDevice, WebAudioHelper, AlphaSynthWebAudioOutputBase, FileLoadError, EngravingSettingsCloner, JsonHelper, EngravingStemInfo, EngravingSettings, FontParserToken, FontParser, FontStyle, FontWeight, Font, RenderingResources, StaveProfile, SystemsLayoutMode, DisplaySettings, ImporterSettings, ScrollMode, VibratoPlaybackSettings, SlidePlaybackSettings, PlayerOutputMode, PlayerMode, PlayerSettings, CoreSettingsSerializer, EngravingStemInfoSerializer, EngravingSettingsSerializer, RenderingResourcesSerializer, DisplaySettingsSerializer, NotationSettingsSerializer, ImporterSettingsSerializer, VibratoPlaybackSettingsSerializer, SlidePlaybackSettingsSerializer, PlayerSettingsSerializer, ExporterSettingsSerializer, SettingsSerializer, ExporterSettings, Settings, ScoreLoader, BrowserMouseEventArgs, HtmlElementContainer, WebPlatform, FontSizeDefinition, FontSizes, FontLoadingChecker, CircularSampleBuffer, AlphaSynthScriptProcessorOutput, BeamingRulesSerializer, SectionSerializer, SyncPointDataSerializer, AutomationSerializer, FermataSerializer, MasterBarSerializer, BendPointSerializer, NoteStyleSerializer, NoteSerializer, TremoloPickingEffectSerializer, BeatStyleSerializer, BeatSerializer, VoiceStyleSerializer, VoiceSerializer, SustainPedalMarkerSerializer, BarStyleSerializer, BarSerializer, ChordSerializer, TuningSerializer, StaffSerializer, PlaybackInformationSerializer, InstrumentArticulationSerializer, TrackStyleSerializer, TrackSerializer, RenderStylesheetSerializer, BackingTrackSerializer, HeaderFooterStyleSerializer, ScoreStyleSerializer, ScoreSerializer, MidiFileFormat, MidiTrack, MidiFile, MidiEventType, MidiEvent, TimeSignatureEvent, AlphaTabSysExEvent, AlphaTabMetronomeEvent, AlphaTabRestEvent, NoteEvent, NoteOnEvent, NoteOffEvent, ControlChangeEvent, ProgramChangeEvent, TempoChangeEvent, PitchBendEvent, NoteBendEvent, EndOfTrackEvent, JsonConverter, MidiEventsPlayedEventArgs, PlaybackRangeChangedEventArgs, PlayerState, PlayerStateChangedEventArgs, PositionChangedEventArgs, AlphaSynthWebWorkerApi, BarBounds, BeatBounds, MasterBarBounds, NoteBounds, StaffSystemBounds, BoundsLookup, AlphaTabWorkerScoreRenderer, Cursors, ScalableHtmlElementContainer, AudioElementBackingTrackSynthOutput, QueueItem, Queue, AudioExportOptions, AudioExportChunk, SynthEvent, BackingTrackSyncPoint, MidiFileSequencerTempoChange, MidiSequencerState, MidiFileSequencer, RiffChunk, OggPacket, OggReader, VorbisStream, IntBitReaderReadResult, IntBitReader, VorbisSetupHeader, VorbisUtils, FastListArray, FastRange, VorbisCodebook, HuffmanListNode, Huffman, VorbisTimeDomainTransform, VorbisFloorData0, VorbisFloor0, VorbisFloor1Data, VorbisFloor1, VorbisFloor, VorbisResidue0, VorbisResidue1, VorbisResidue2, VorbisResidue, VorbisMapping, VorbisModeOverlapInfo, VorbisModePacketInfo, VorbisReadNextPacketResult, VorbisMode, MdctImpl, Mdct, VorbisStreamDecoder, DecodeNextPacketInfo, VorbisStreamReader, VorbisFile, Hydra, HydraIbag, HydraImod, HydraIgen, HydraInst, HydraPbag, HydraPgen, HydraPhdr, HydraPmod, HydraShdr, HydraGenAmount, Channel, Channels, LoopMode, OutputMode, Preset, SynthHelper, Envelope, Region, VoiceEnvelopeSegment, VoiceEnvelope, VoiceLfo, VoiceLowPass, Voice, ControllerType, TinySoundFont, AlphaSynthBase, AlphaSynth, AlphaSynthAudioExporter, BackingTrackAudioSynthesizer, BackingTrackPlayer, AlphaSynthAudioExporterWorkerApi, RenderFinishedEventArgs, ScoreRenderer, BrowserUiFacade, AlphaSynthWebWorklet, AlphaSynthAudioWorkletOutput, Html5Canvas, AlphaSynthMidiFileHandler, Repeat, MidiPlaybackController, BeatTickLookupItem, BeatTickLookup, MasterBarTickLookupTempoChange, MasterBarTickLookup, PlaybackRange, MidiTickLookupFindBeatResultCursorMode, MidiTickLookupFindBeatResult, TrackLookupBeatVisibilityChecker, MidiTickLookup, MidiNoteDuration, TripletFeelDurations, RasgueadoInfo, PlayThroughContext, MidiFileGenerator, ToNextBeatAnimatingCursorHandler, NonAnimatingCursorHandler, BeatXPosition, Glyph, BeatContainerGlyphBase, BeatContainerGlyph, ScoreRendererWrapper, ResizeEventArgs, BasicScrollHandler, VerticalContinuousScrollHandler, VerticalOffScreenScrollHandler, VerticalSmoothScrollHandler, HorizontalContinuousScrollHandler, HorizontalOffScreenScrollHandler, HorizontalSmoothScrollHandler, ActiveBeatsChangedEventArgs, AlphaSynthWrapper, ExternalMediaSynthOutput, ExternalMediaPlayer, BoundsLookupVisibilityChecker, AlphaTabApiBase, ProgressEventArgs, AlphaTabApi, JQueryAlphaTab, SkiaCanvas, SvgCanvas, CssFontSvgCanvas, AlphaSynthWorkerSynthOutput, AlphaSynthWebWorker, AlphaTabWebWorker, EffectBandMode, BarRendererFactory, EffectBarGlyphSizing, EffectGlyph, AlternateEndingsGlyph, EffectInfo, AlternateEndingsEffectInfo, GroupedEffectGlyph, LineRangedGlyph, BeatBarreEffectInfo, BeatTimerGlyph, BeatTimerEffectInfo, TextGlyph, CapoEffectInfo, ChordDiagramGlyph, ChordsEffectInfo, CrescendoGlyph, CrescendoEffectInfo, TargetDirectionGlyph, JumpDirectionGlyph, DirectionsContainerGlyph, DirectionsEffectInfo, MusicFontGlyph, MusicFontTextGlyph, DynamicsGlyph, DynamicsEffectInfo, FadeGlyph, FadeEffectInfo, FermataGlyph, FermataEffectInfo, GlyphGroup, ElementStyleHelper, ElementStyleScope, FingeringInfo, FingeringGroupGlyph, FingeringEffectInfo, FreeTimeEffectInfo, GuitarGolpeGlyph, GolpeEffectInfo, NoteEffectInfoBase, HarmonicsEffectInfo, LeftHandTapGlyph, LeftHandTapEffectInfo, LetRingEffectInfo, LyricsGlyph, LyricsEffectInfo, MarkerEffectInfo, NoteOrnamentGlyph, NoteOrnamentEffectInfo, AccidentalGlyph, NumberedKeySignatureGlyph, NumberedBarKeySignatureEffectInfo, OttavaGlyph, OttaviaEffectInfo, PalmMuteEffectInfo, PickSlideEffectInfo, PickStrokeGlyph, PickStrokeEffectInfo, RasgueadoEffectInfo, EffectBand, EffectBandSlotShared, EffectBandSlot, EffectBandSizingInfo, EffectBandContainer, LeftToRightLayoutingGlyphGroup, MultiVoiceContainerGlyph, TieGlyph, NoteTieGlyph, ContinuationTieGlyph, NumberGlyph, MultiBarRestGlyph, MultiBarRestBeatContainerGlyph, BeamingHelperDrawInfo, BeamingHelper, ReservedLayoutAreaSlot, ReservedLayoutArea, BarCollisionHelper, BeamingRuleLookup, BarHelpers, NoteYPosition, NoteXPosition, BarRendererBase, VibratoGlyphBase, NoteVibratoGlyph, TabBendRenderPoint, TabBendGlyph, TabWhammyBarGlyph, SimpleDipWhammyBarEffectInfo, BeatVibratoGlyph, SlightBeatVibratoEffectInfo, SlightNoteVibratoEffectInfo, SustainPedalGlyph, SustainPedalEffectInfo, TabWhammyEffectInfo, TapEffectInfo, BarTempoGlyph, TempoEffectInfo, TextEffectInfo, TrillGlyph, TrillEffectInfo, TripletFeelGlyph, TripletFeelEffectInfo, WahPedalGlyph, WahPedalEffectInfo, WhammyBarEffectInfo, WideBeatVibratoEffectInfo, WideNoteVibratoEffectInfo, RowGlyphContainer, RowContainerGlyph, ChordDiagramContainerGlyph, TuningContainerGlyph, TuningGlyph, SlurRegistry, RenderStaff, Spring, BarLayoutingInfo, MasterBarsRenderers, StaffTrackGroup, SystemBracket, SingleTrackSystemBracket, SimilarInstrumentSystemBracket, StaffSystem, ScoreLayout, HorizontalScreenLayoutPartialInfo, HorizontalScreenLayout, VerticalLayoutBase, PageViewLayout, ParchmentLayout, BarLineGlyphBase, BarLineLightGlyph, BarLineDottedGlyph, BarLineDashedGlyph, BarLineHeavyGlyph, BarLineRepeatDotsGlyph, BarLineShortGlyph, BarLineTickGlyph, BarLineGlyph, BarNumberGlyph, NumberedTieGlyph, AccidentalColumnInfo, AccidentalGroupGlyph, AugmentationDotGlyph, BeatGlyphBase, BeatOnNoteGlyphBase, DeadSlappedBeatGlyph, NumberedNoteHeadGlyph, SpacingGlyph, NumberedBeatPreNotesGlyph, NumberedBeatGlyph, TabTieGlyph, TieGlyphLabels, TabSlurGlyph, NumberedSlurGlyph, NumberedBeatContainerGlyph, NumberedNoteBeatContainerGlyphBase, NumberedDashBeatContainerGlyph, GhostParenthesisGlyph, TimeSignatureGlyph, ScoreTimeSignatureGlyph, FlagGlyph, RepeatCountGlyph, LineBarRenderer, NumberedBarRenderer, NumberedBarRendererFactory, ClefGlyph, KeySignatureGlyph, AccentuationGlyph, ArticStaccatoAboveGlyph, NoteHeadGlyphBase, NoteHeadGlyph, DeadNoteHeadGlyph, DiamondNoteHeadGlyph, GhostNoteInfo, GhostNoteContainerGlyph, PercussionNoteHeadGlyph, PictEdgeOfCymbalGlyph, ScoreChordNoteHeadInfo, ScoreNoteChordGlyphBase, TremoloPickingGlyph, ScoreNoteChordGlyph, ScoreRestGlyph, BendNoteHeadGroupGlyph, ScoreHelperNotesBaseGlyph, ScoreWhammyBarGlyph, SlashNoteHeadGlyph, StringNumberContainerGlyph, ScoreBeatGlyph, ScoreBrushGlyph, ScoreBeatPreNotesGlyph, ScoreBendGlyph, ScoreLegatoGlyph, ScoreSlideLineGlyph, ScoreTieGlyph, ScoreSlurGlyph, ScoreBeatContainerGlyph, ScoreBarRenderer, ScoreBarRendererFactory, SlashRestGlyph, SlashBeatGlyph, SlashTieGlyph, SlashBeatContainerGlyph, SlashBarRenderer, SlashBarRendererFactory, NoteNumberGlyph, TabNoteChordGlyph, TabRestGlyph, TabBeatGlyph, TabBrushGlyph, TabBeatPreNotesGlyph, TabSlideLineGlyph, TabBeatContainerGlyph, TabClefGlyph, TabTimeSignatureGlyph, TabBarRenderer, TabBarRendererFactory, LayoutEngineFactory, RenderEngineFactory, Environment, FontFileFormat, CoreSettings, _barrel_exports$8, _barrel_exports$1, ScoreExporter, AlphaTexWriter, AlphaTexPrinter, AlphaTexExporter, GpifMidiProgramInfo, GpifInstrumentSet, GpifInstrumentElement, GpifInstrumentArticulation, GpifSoundMapper, GpifWriter, Crc32, DeflaterConstants, Tree, DeflaterHuffman, DeflaterEngine, PendingBuffer, Deflater, ZipCentralDirectoryHeader, ZipWriter, Gp7Exporter, _barrel_exports, DeprecatedMidiEvent, MetaEventType, MetaEvent, MetaDataEvent, MetaNumberEvent, Midi20PerNotePitchBendEvent, SystemCommonType, SystemCommonEvent, AlphaTabSystemExclusiveEvents, SystemExclusiveEvent, _barrel_exports$3, _barrel_exports$4;
|
|
23113
|
+
var __defProp2, __exportAll, ResizeObserverPolyfill, IntersectionObserverPolyfill, AlphaTabErrorType, AlphaTabError, VersionInfo, DynamicValue, MidiUtils, AutomationType, SyncPointData, Automation, BendPoint, BendStyle, BendType, BrushType, CrescendoType, Duration, GraceType, AccentuationType, Fingers, HarmonicType, NoteAccidentalMode, Ottavia, SlideInType, SlideOutType, Slur, SlurSegmentKind, VibratoType, TabRhythmMode, FingeringMode, NotationMode, NotationElement, NotationSettings, Lazy, LogLevel, ConsoleLogger, Logger, AccidentalType, Clef, SimileMark, ElementStyle, KeySignature, KeySignatureType, SustainPedalMarkerType, SustainPedalMarker, BarSubElement, BarStyle, BarLineStyle, Bar, TripletFeel, BeamingRules, MasterBar, BracketExtendMode, TrackNamePolicy, TrackNameMode, TrackNameOrientation, BarNumberDisplay, RenderStylesheet, RepeatGroup, GraceGroup, VoiceSubElement, VoiceStyle, Voice$1, TextAlign, TextBaseline, MeasuredText, CanvasHelper, ScoreSubElement, HeaderFooterStyle, ScoreStyle, Score, SynthConstants, TuningParseResult, TuningParseResultTone, ModelUtils, PickStroke, MusicFontSymbol, MusicFontSymbolLookup, TechniqueSymbolPlacement, InstrumentArticulation, PercussionMapper, NoteOrnament, NoteIdBag, NoteSubElement, NoteStyle, Note3, TupletGroup, WhammyType, GolpeType, FadeType, WahPedal, BarreShape, Rasgueado, TremoloPickingStyle, TremoloPickingEffect, BeatBeamingMode, BeatSubElement, BeatStyle, Beat, BendPointCloner, NoteCloner, SyncPointDataCloner, AutomationCloner, TremoloPickingEffectCloner, BeatCloner, AlphaTex1EnumMappings, AlphaTex1LanguageDefinitions, AlphaTexNodeType, AlphaTexDiagnosticsSeverity, AlphaTexDiagnosticCode, AlphaTexDiagnosticBag, AlphaTexAccidentalMode, AlphaTexVoiceMode, AlphaTexStaffNoteKind, ArgumentListParseTypesMode, TypeConversions, IOHelper, AlphaTexLexer, AlphaTexParseMode, AlphaTexParser, Atnf, AlphaTex1MetaDataReader, ApplyNodeResult, ApplyStructuralMetaDataResult, GeneralMidi, Chord3, FormatError, Color, FermataType, Fermata, Lyrics, Section, Tuning, Staff, PlaybackInformation, TrackSubElement, TrackStyle, Track, BeamDirection, AlphaTex1LanguageHandler, EndOfReaderError, OverflowError, ThrowingReadable, ScoreImporter, UnsupportedFormatError, ByteBuffer, AlphaTexErrorWithDiagnostics, AlphaTexImportState, AlphaTexImporter, Huffman$1, Found, NeedBit, NeedBits, HuffTools, InflateWindow, Inflate, ZipEntry, ZipReader, XmlNodeType, XmlNode, XmlError, XmlParser, XmlWriter, XmlDocument, DrawObject, TextDrawObject, GuitarDrawObject, SlurDrawObject, WavyLineDrawObject, TupletBracketDrawObject, WedgeDrawObject, VoltaDrawObject, OctaveClefDrawObject, TrillDrawObject, StaffLayout, Bracket, CapellaVoiceState, CapellaParser, CapellaImporter, Direction, Gp3To5Importer, GpBinaryHelpers, MixTableChange, Bounds, BinaryStylesheet, BackingTrack, GpifRhythm, GpifSound, GpifParser, PartConfigurationScoreView, PartConfigurationTrackViewGroup, PartConfiguration, LayoutConfigurationScoreView, LayoutConfigurationTrackViewGroup, LayoutConfiguration, Gp7To8Importer, BitReader, GpxFile, GpxFileSystem, GpxImporter, BeatSteps, AccidentalHelper, StaffContext, InstrumentArticulationWithPlaybackInfo, TrackInfo, MusicXmlImporter, LayoutMode, EventEmitter, EventEmitterOfT, AlphaSynthWebAudioSynthOutputDevice, WebAudioHelper, AlphaSynthWebAudioOutputBase, FileLoadError, EngravingSettingsCloner, JsonHelper, EngravingStemInfo, EngravingSettings, FontParserToken, FontParser, FontStyle, FontWeight, Font, RenderingResources, StaveProfile, SystemsLayoutMode, DisplaySettings, ImporterSettings, ScrollMode, VibratoPlaybackSettings, SlidePlaybackSettings, PlayerOutputMode, PlayerMode, PlayerSettings, CoreSettingsSerializer, EngravingStemInfoSerializer, EngravingSettingsSerializer, RenderingResourcesSerializer, DisplaySettingsSerializer, NotationSettingsSerializer, ImporterSettingsSerializer, VibratoPlaybackSettingsSerializer, SlidePlaybackSettingsSerializer, PlayerSettingsSerializer, ExporterSettingsSerializer, SettingsSerializer, ExporterSettings, Settings, ScoreLoader, BrowserMouseEventArgs, HtmlElementContainer, WebPlatform, FontSizeDefinition, FontSizes, FontLoadingChecker, CircularSampleBuffer, AlphaSynthScriptProcessorOutput, BeamingRulesSerializer, SectionSerializer, SyncPointDataSerializer, AutomationSerializer, FermataSerializer, MasterBarSerializer, BendPointSerializer, NoteStyleSerializer, NoteSerializer, TremoloPickingEffectSerializer, BeatStyleSerializer, BeatSerializer, VoiceStyleSerializer, VoiceSerializer, SustainPedalMarkerSerializer, BarStyleSerializer, BarSerializer, ChordSerializer, TuningSerializer, StaffSerializer, PlaybackInformationSerializer, InstrumentArticulationSerializer, TrackStyleSerializer, TrackSerializer, RenderStylesheetSerializer, BackingTrackSerializer, HeaderFooterStyleSerializer, ScoreStyleSerializer, ScoreSerializer, MidiFileFormat, MidiTrack, MidiFile, MidiEventType, MidiEvent, TimeSignatureEvent, AlphaTabSysExEvent, AlphaTabMetronomeEvent, AlphaTabRestEvent, NoteEvent, NoteOnEvent, NoteOffEvent, ControlChangeEvent, ProgramChangeEvent, TempoChangeEvent, PitchBendEvent, NoteBendEvent, EndOfTrackEvent, JsonConverter, MidiEventsPlayedEventArgs, PlaybackRangeChangedEventArgs, PlayerState, PlayerStateChangedEventArgs, PositionChangedEventArgs, AlphaSynthWebWorkerApi, BarBounds, BeatBounds, MasterBarBounds, NoteBounds, StaffSystemBounds, BoundsLookup, AlphaTabWorkerScoreRenderer, Cursors, ScalableHtmlElementContainer, AudioElementBackingTrackSynthOutput, QueueItem, Queue, AudioExportOptions, AudioExportChunk, SynthEvent, BackingTrackSyncPoint, MidiFileSequencerTempoChange, MidiSequencerState, MidiFileSequencer, RiffChunk, OggPacket, OggReader, VorbisStream, IntBitReaderReadResult, IntBitReader, VorbisSetupHeader, VorbisUtils, FastListArray, FastRange, VorbisCodebook, HuffmanListNode, Huffman, VorbisTimeDomainTransform, VorbisFloorData0, VorbisFloor0, VorbisFloor1Data, VorbisFloor1, VorbisFloor, VorbisResidue0, VorbisResidue1, VorbisResidue2, VorbisResidue, VorbisMapping, VorbisModeOverlapInfo, VorbisModePacketInfo, VorbisReadNextPacketResult, VorbisMode, MdctImpl, Mdct, VorbisStreamDecoder, DecodeNextPacketInfo, VorbisStreamReader, VorbisFile, Hydra, HydraIbag, HydraImod, HydraIgen, HydraInst, HydraPbag, HydraPgen, HydraPhdr, HydraPmod, HydraShdr, HydraGenAmount, Channel, Channels, LoopMode, OutputMode, Preset, SynthHelper, Envelope, Region, VoiceEnvelopeSegment, VoiceEnvelope, VoiceLfo, VoiceLowPass, Voice, ControllerType, TinySoundFont, AlphaSynthBase, AlphaSynth, AlphaSynthAudioExporter, BackingTrackAudioSynthesizer, BackingTrackPlayer, AlphaSynthAudioExporterWorkerApi, RenderFinishedEventArgs, ScoreRenderer, BrowserUiFacade, AlphaSynthWebWorklet, AlphaSynthAudioWorkletOutput, Html5Canvas, AlphaSynthMidiFileHandler, Repeat, MidiPlaybackController, BeatTickLookupItem, BeatTickLookup, MasterBarTickLookupTempoChange, MasterBarTickLookup, PlaybackRange, MidiTickLookupFindBeatResultCursorMode, MidiTickLookupFindBeatResult, TrackLookupBeatVisibilityChecker, MidiTickLookup, MidiNoteDuration, TripletFeelDurations, RasgueadoInfo, PlayThroughContext, MidiFileGenerator, ToNextBeatAnimatingCursorHandler, NonAnimatingCursorHandler, BeatXPosition, Glyph, BeatContainerGlyphBase, BeatContainerGlyph, ScoreRendererWrapper, ResizeEventArgs, BasicScrollHandler, VerticalContinuousScrollHandler, VerticalOffScreenScrollHandler, VerticalSmoothScrollHandler, HorizontalContinuousScrollHandler, HorizontalOffScreenScrollHandler, HorizontalSmoothScrollHandler, ActiveBeatsChangedEventArgs, AlphaSynthWrapper, ExternalMediaSynthOutput, ExternalMediaPlayer, BoundsLookupVisibilityChecker, AlphaTabApiBase, ProgressEventArgs, AlphaTabApi, JQueryAlphaTab, SkiaCanvas, SvgCanvas, CssFontSvgCanvas, AlphaSynthWorkerSynthOutput, AlphaSynthWebWorker, AlphaTabWebWorker, EffectBandMode, BarRendererFactory, EffectBarGlyphSizing, EffectGlyph, AlternateEndingsGlyph, EffectInfo, AlternateEndingsEffectInfo, GroupedEffectGlyph, LineRangedGlyph, BeatBarreEffectInfo, BeatTimerGlyph, BeatTimerEffectInfo, TextGlyph, CapoEffectInfo, ChordDiagramGlyph, ChordsEffectInfo, CrescendoGlyph, CrescendoEffectInfo, TargetDirectionGlyph, JumpDirectionGlyph, DirectionsContainerGlyph, DirectionsEffectInfo, MusicFontGlyph, MusicFontTextGlyph, DynamicsGlyph, DynamicsEffectInfo, FadeGlyph, FadeEffectInfo, FermataGlyph, FermataEffectInfo, GlyphGroup, ElementStyleHelper, ElementStyleScope, FingeringInfo, FingeringGroupGlyph, FingeringEffectInfo, FreeTimeEffectInfo, GuitarGolpeGlyph, GolpeEffectInfo, NoteEffectInfoBase, HarmonicsEffectInfo, LeftHandTapGlyph, LeftHandTapEffectInfo, LetRingEffectInfo, LyricsGlyph, LyricsEffectInfo, MarkerEffectInfo, NoteOrnamentGlyph, NoteOrnamentEffectInfo, AccidentalGlyph, NumberedKeySignatureGlyph, NumberedBarKeySignatureEffectInfo, OttavaGlyph, OttaviaEffectInfo, PalmMuteEffectInfo, PickSlideEffectInfo, PickStrokeGlyph, PickStrokeEffectInfo, RasgueadoEffectInfo, EffectBand, EffectBandSlotShared, EffectBandSlot, EffectBandSizingInfo, EffectBandContainer, LeftToRightLayoutingGlyphGroup, MultiVoiceContainerGlyph, TieGlyph, NoteTieGlyph, ContinuationTieGlyph, NumberGlyph, MultiBarRestGlyph, MultiBarRestBeatContainerGlyph, BeamingHelperDrawInfo, BeamingHelper, ReservedLayoutAreaSlot, ReservedLayoutArea, BarCollisionHelper, BeamingRuleLookup, BarHelpers, NoteYPosition, NoteXPosition, BarRendererBase, VibratoGlyphBase, NoteVibratoGlyph, TabBendRenderPoint, TabBendGlyph, TabWhammyBarGlyph, SimpleDipWhammyBarEffectInfo, BeatVibratoGlyph, SlightBeatVibratoEffectInfo, SlightNoteVibratoEffectInfo, SustainPedalGlyph, SustainPedalEffectInfo, TabWhammyEffectInfo, TapEffectInfo, BarTempoGlyph, TempoEffectInfo, TextEffectInfo, TrillGlyph, TrillEffectInfo, TripletFeelGlyph, TripletFeelEffectInfo, WahPedalGlyph, WahPedalEffectInfo, WhammyBarEffectInfo, WideBeatVibratoEffectInfo, WideNoteVibratoEffectInfo, RowGlyphContainer, RowContainerGlyph, ChordDiagramContainerGlyph, TuningContainerGlyph, TuningGlyph, SlurRegistry, RenderStaff, Spring, BarLayoutingInfo, MasterBarsRenderers, StaffTrackGroup, SystemBracket, SingleTrackSystemBracket, SimilarInstrumentSystemBracket, StaffSystem, ScoreLayout, HorizontalScreenLayoutPartialInfo, HorizontalScreenLayout, VerticalLayoutBase, PageViewLayout, ParchmentLayout, BarLineGlyphBase, BarLineLightGlyph, BarLineDottedGlyph, BarLineDashedGlyph, BarLineHeavyGlyph, BarLineRepeatDotsGlyph, BarLineShortGlyph, BarLineTickGlyph, BarLineGlyph, BarNumberGlyph, NumberedTieGlyph, AccidentalColumnInfo, AccidentalGroupGlyph, AugmentationDotGlyph, BeatGlyphBase, BeatOnNoteGlyphBase, DeadSlappedBeatGlyph, NumberedNoteHeadGlyph, SpacingGlyph, NumberedBeatPreNotesGlyph, NumberedBeatGlyph, TabTieGlyph, TieGlyphLabels, TabSlurGlyph, NumberedSlurGlyph, NumberedBeatContainerGlyph, NumberedNoteBeatContainerGlyphBase, NumberedDashBeatContainerGlyph, GhostParenthesisGlyph, TimeSignatureGlyph, ScoreTimeSignatureGlyph, FlagGlyph, RepeatCountGlyph, LineBarRenderer, NumberedBarRenderer, NumberedBarRendererFactory, ClefGlyph, KeySignatureGlyph, AccentuationGlyph, ArticStaccatoAboveGlyph, NoteHeadGlyphBase, NoteHeadGlyph, DeadNoteHeadGlyph, DiamondNoteHeadGlyph, GhostNoteInfo, GhostNoteContainerGlyph, PercussionNoteHeadGlyph, PictEdgeOfCymbalGlyph, ScoreChordNoteHeadInfo, ScoreNoteChordGlyphBase, TremoloPickingGlyph, ScoreNoteChordGlyph, ScoreRestGlyph, BendNoteHeadGroupGlyph, ScoreHelperNotesBaseGlyph, ScoreWhammyBarGlyph, SlashNoteHeadGlyph, StringNumberContainerGlyph, ScoreBeatGlyph, ScoreBrushGlyph, ScoreBeatPreNotesGlyph, ScoreBendGlyph, ScoreLegatoGlyph, ScoreSlideLineGlyph, ScoreTieGlyph, ScoreSlurGlyph, ScoreBeatContainerGlyph, ScoreBarRenderer, ScoreBarRendererFactory, SlashRestGlyph, SlashBeatGlyph, SlashTieGlyph, SlashBeatContainerGlyph, SlashBarRenderer, SlashBarRendererFactory, NoteNumberGlyph, TabNoteChordGlyph, TabRestGlyph, TabBeatGlyph, TabBrushGlyph, TabBeatPreNotesGlyph, TabSlideLineGlyph, TabBeatContainerGlyph, TabClefGlyph, TabTimeSignatureGlyph, TabBarRenderer, TabBarRendererFactory, LayoutEngineFactory, RenderEngineFactory, Environment, FontFileFormat, CoreSettings, _barrel_exports$8, _barrel_exports$1, ScoreExporter, AlphaTexWriter, AlphaTexPrinter, AlphaTexExporter, GpifMidiProgramInfo, GpifInstrumentSet, GpifInstrumentElement, GpifInstrumentArticulation, GpifSoundMapper, GpifWriter, Crc32, DeflaterConstants, Tree, DeflaterHuffman, DeflaterEngine, PendingBuffer, Deflater, ZipCentralDirectoryHeader, ZipWriter, Gp7Exporter, _barrel_exports, DeprecatedMidiEvent, MetaEventType, MetaEvent, MetaDataEvent, MetaNumberEvent, Midi20PerNotePitchBendEvent, SystemCommonType, SystemCommonEvent, AlphaTabSystemExclusiveEvents, SystemExclusiveEvent, _barrel_exports$3, _barrel_exports$4, _barrel_exports$7;
|
|
23084
23114
|
var init_alphaTab_core = __esm({
|
|
23085
23115
|
"node_modules/@coderline/alphatab/dist/alphaTab.core.mjs"() {
|
|
23086
23116
|
__defProp2 = Object.defineProperty;
|
|
@@ -87539,6 +87569,25 @@ ${AlphaTex1MetaDataReader.generateSignatures(signatures)}`,
|
|
|
87539
87569
|
WahPedal: () => WahPedal,
|
|
87540
87570
|
WhammyType: () => WhammyType
|
|
87541
87571
|
});
|
|
87572
|
+
_barrel_exports$7 = /* @__PURE__ */ __exportAll({
|
|
87573
|
+
ActiveBeatsChangedEventArgs: () => ActiveBeatsChangedEventArgs,
|
|
87574
|
+
AlphaSynth: () => AlphaSynth,
|
|
87575
|
+
AlphaSynthAudioWorkletOutput: () => AlphaSynthAudioWorkletOutput,
|
|
87576
|
+
AlphaSynthBase: () => AlphaSynthBase,
|
|
87577
|
+
AlphaSynthScriptProcessorOutput: () => AlphaSynthScriptProcessorOutput,
|
|
87578
|
+
AlphaSynthWebAudioOutputBase: () => AlphaSynthWebAudioOutputBase,
|
|
87579
|
+
AlphaSynthWebWorkerApi: () => AlphaSynthWebWorkerApi,
|
|
87580
|
+
AudioExportChunk: () => AudioExportChunk,
|
|
87581
|
+
AudioExportOptions: () => AudioExportOptions,
|
|
87582
|
+
BackingTrackSyncPoint: () => BackingTrackSyncPoint,
|
|
87583
|
+
CircularSampleBuffer: () => CircularSampleBuffer,
|
|
87584
|
+
MidiEventsPlayedEventArgs: () => MidiEventsPlayedEventArgs,
|
|
87585
|
+
PlaybackRange: () => PlaybackRange,
|
|
87586
|
+
PlaybackRangeChangedEventArgs: () => PlaybackRangeChangedEventArgs,
|
|
87587
|
+
PlayerState: () => PlayerState,
|
|
87588
|
+
PlayerStateChangedEventArgs: () => PlayerStateChangedEventArgs,
|
|
87589
|
+
PositionChangedEventArgs: () => PositionChangedEventArgs
|
|
87590
|
+
});
|
|
87542
87591
|
}
|
|
87543
87592
|
});
|
|
87544
87593
|
|
|
@@ -89511,6 +89560,1184 @@ var init_importarGp = __esm({
|
|
|
89511
89560
|
}
|
|
89512
89561
|
});
|
|
89513
89562
|
|
|
89563
|
+
// packages/io/src/importarMidi.ts
|
|
89564
|
+
function esMidi(bytes) {
|
|
89565
|
+
return firmaEn(bytes, 0, "MThd") || firmaEn(bytes, 0, "RIFF") && firmaEn(bytes, 8, "RMID");
|
|
89566
|
+
}
|
|
89567
|
+
function importarMidi(bytes, opciones = {}) {
|
|
89568
|
+
const smf = leerSmf(bytes);
|
|
89569
|
+
const avisos = new Avisos();
|
|
89570
|
+
const leido = recolectar(smf, avisos);
|
|
89571
|
+
const score = armarScore(leido, opciones, avisos);
|
|
89572
|
+
const resultado = importarScore(score, opciones);
|
|
89573
|
+
resultado.avisos = resultado.avisos.filter((a) => !a.startsWith("Las preferencias de dibujo del archivo"));
|
|
89574
|
+
resultado.avisos.push(...avisos.lista());
|
|
89575
|
+
return resultado;
|
|
89576
|
+
}
|
|
89577
|
+
function firmaEn(bytes, desde, firma) {
|
|
89578
|
+
if (bytes.length < desde + firma.length) return false;
|
|
89579
|
+
for (let i2 = 0; i2 < firma.length; i2++) if (bytes[desde + i2] !== firma.charCodeAt(i2)) return false;
|
|
89580
|
+
return true;
|
|
89581
|
+
}
|
|
89582
|
+
function desenvolverRmid(bytes) {
|
|
89583
|
+
if (!(firmaEn(bytes, 0, "RIFF") && firmaEn(bytes, 8, "RMID"))) return bytes;
|
|
89584
|
+
const vista = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
89585
|
+
let pos = 12;
|
|
89586
|
+
while (pos + 8 <= bytes.length) {
|
|
89587
|
+
const largo = vista.getUint32(pos + 4, true);
|
|
89588
|
+
if (firmaEn(bytes, pos, "data")) {
|
|
89589
|
+
if (pos + 8 + largo > bytes.length) throw truncado("el bloque \xABdata\xBB del RMID");
|
|
89590
|
+
return bytes.subarray(pos + 8, pos + 8 + largo);
|
|
89591
|
+
}
|
|
89592
|
+
pos += 8 + largo + largo % 2;
|
|
89593
|
+
}
|
|
89594
|
+
throw new MidiIlegible("El archivo RMID no tiene adentro un bloque de datos MIDI.");
|
|
89595
|
+
}
|
|
89596
|
+
function leerSmf(entrada) {
|
|
89597
|
+
const bytes = desenvolverRmid(entrada);
|
|
89598
|
+
if (!firmaEn(bytes, 0, "MThd")) {
|
|
89599
|
+
throw new MidiIlegible("El archivo no es un MIDI: no empieza con la firma \xABMThd\xBB.");
|
|
89600
|
+
}
|
|
89601
|
+
if (bytes.length < 14) throw truncado("la cabecera");
|
|
89602
|
+
const vista = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
89603
|
+
const largoDeCabecera = vista.getUint32(4);
|
|
89604
|
+
if (largoDeCabecera < 6) throw new MidiIlegible("La cabecera del MIDI es m\xE1s corta de lo que manda el formato.");
|
|
89605
|
+
if (8 + largoDeCabecera > bytes.length) throw truncado("la cabecera");
|
|
89606
|
+
const formato = vista.getUint16(8);
|
|
89607
|
+
const declaradas = vista.getUint16(10);
|
|
89608
|
+
const division = vista.getUint16(12);
|
|
89609
|
+
let smpte = null;
|
|
89610
|
+
if (division & 32768) {
|
|
89611
|
+
const cuadros = -(division >> 8 << 24 >> 24);
|
|
89612
|
+
smpte = { cuadrosPorSegundo: cuadros === 29 ? 29.97 : cuadros, ticsPorCuadro: division & 255 };
|
|
89613
|
+
if (smpte.cuadrosPorSegundo <= 0 || smpte.ticsPorCuadro === 0) {
|
|
89614
|
+
throw new MidiIlegible("La cabecera del MIDI declara una divisi\xF3n de tiempo imposible.");
|
|
89615
|
+
}
|
|
89616
|
+
} else if (division === 0) {
|
|
89617
|
+
throw new MidiIlegible("La cabecera del MIDI declara 0 tics por negra.");
|
|
89618
|
+
}
|
|
89619
|
+
const pistas = [];
|
|
89620
|
+
let pos = 8 + largoDeCabecera;
|
|
89621
|
+
while (pistas.length < declaradas) {
|
|
89622
|
+
if (pos + 8 > bytes.length) {
|
|
89623
|
+
throw truncado(`la cabecera anuncia ${declaradas} pista(s) y s\xF3lo hay ${pistas.length}`);
|
|
89624
|
+
}
|
|
89625
|
+
const largo = vista.getUint32(pos + 4);
|
|
89626
|
+
const esPista = firmaEn(bytes, pos, "MTrk");
|
|
89627
|
+
pos += 8;
|
|
89628
|
+
if (pos + largo > bytes.length) throw truncado(`la pista ${pistas.length + 1}`);
|
|
89629
|
+
if (esPista) pistas.push(leerPista(bytes.subarray(pos, pos + largo), pistas.length + 1));
|
|
89630
|
+
pos += largo;
|
|
89631
|
+
}
|
|
89632
|
+
return { formato, division, smpte, pistas };
|
|
89633
|
+
}
|
|
89634
|
+
function leerPista(datos, numero2) {
|
|
89635
|
+
let p = 0;
|
|
89636
|
+
let tic = 0;
|
|
89637
|
+
let estado = 0;
|
|
89638
|
+
const eventos = [];
|
|
89639
|
+
const byte = () => {
|
|
89640
|
+
if (p >= datos.length) throw truncado(`un evento a medias en la pista ${numero2}`);
|
|
89641
|
+
return datos[p++];
|
|
89642
|
+
};
|
|
89643
|
+
const largoVariable = () => {
|
|
89644
|
+
let valor = 0;
|
|
89645
|
+
for (let i2 = 0; i2 < 4; i2++) {
|
|
89646
|
+
const b = byte();
|
|
89647
|
+
valor = valor * 128 + (b & 127);
|
|
89648
|
+
if (!(b & 128)) return valor;
|
|
89649
|
+
}
|
|
89650
|
+
throw new MidiIlegible(`La pista ${numero2} trae un n\xFAmero de m\xE1s de 4 bytes: el archivo est\xE1 da\xF1ado.`);
|
|
89651
|
+
};
|
|
89652
|
+
const tomar = (n) => {
|
|
89653
|
+
if (p + n > datos.length) throw truncado(`un evento a medias en la pista ${numero2}`);
|
|
89654
|
+
const trozo = datos.subarray(p, p + n);
|
|
89655
|
+
p += n;
|
|
89656
|
+
return trozo;
|
|
89657
|
+
};
|
|
89658
|
+
while (p < datos.length) {
|
|
89659
|
+
tic += largoVariable();
|
|
89660
|
+
let b = byte();
|
|
89661
|
+
if (b === 255) {
|
|
89662
|
+
const meta3 = byte();
|
|
89663
|
+
const contenido = tomar(largoVariable());
|
|
89664
|
+
if (meta3 === 47) break;
|
|
89665
|
+
eventos.push({ tipo: "meta", tic, meta: meta3, datos: contenido });
|
|
89666
|
+
continue;
|
|
89667
|
+
}
|
|
89668
|
+
if (b === 240 || b === 247) {
|
|
89669
|
+
tomar(largoVariable());
|
|
89670
|
+
eventos.push({ tipo: "sysex", tic });
|
|
89671
|
+
continue;
|
|
89672
|
+
}
|
|
89673
|
+
let dato1;
|
|
89674
|
+
if (b < 128) {
|
|
89675
|
+
if (!estado) throw new MidiIlegible(`La pista ${numero2} trae datos sin un evento que los explique: el archivo est\xE1 da\xF1ado.`);
|
|
89676
|
+
dato1 = b;
|
|
89677
|
+
b = estado;
|
|
89678
|
+
} else {
|
|
89679
|
+
if (b >= 240) throw new MidiIlegible(`La pista ${numero2} trae un mensaje de sistema que no puede ir en un archivo (0x${b.toString(16)}).`);
|
|
89680
|
+
estado = b;
|
|
89681
|
+
dato1 = byte();
|
|
89682
|
+
}
|
|
89683
|
+
const canal = b & 15;
|
|
89684
|
+
switch (b & 240) {
|
|
89685
|
+
case 128:
|
|
89686
|
+
byte();
|
|
89687
|
+
eventos.push({ tipo: "nota", tic, canal, altura: dato1 & 127, velocidad: 0 });
|
|
89688
|
+
break;
|
|
89689
|
+
case 144:
|
|
89690
|
+
eventos.push({ tipo: "nota", tic, canal, altura: dato1 & 127, velocidad: byte() & 127 });
|
|
89691
|
+
break;
|
|
89692
|
+
case 160:
|
|
89693
|
+
byte();
|
|
89694
|
+
eventos.push({ tipo: "presion", tic, canal });
|
|
89695
|
+
break;
|
|
89696
|
+
case 176:
|
|
89697
|
+
eventos.push({ tipo: "control", tic, canal, control: dato1, valor: byte() });
|
|
89698
|
+
break;
|
|
89699
|
+
case 192:
|
|
89700
|
+
eventos.push({ tipo: "programa", tic, canal, programa: dato1 & 127 });
|
|
89701
|
+
break;
|
|
89702
|
+
case 208:
|
|
89703
|
+
eventos.push({ tipo: "presion", tic, canal });
|
|
89704
|
+
break;
|
|
89705
|
+
case 224:
|
|
89706
|
+
eventos.push({ tipo: "bend", tic, canal, valor: dato1 | byte() << 7 });
|
|
89707
|
+
break;
|
|
89708
|
+
}
|
|
89709
|
+
}
|
|
89710
|
+
return { eventos, fin: tic };
|
|
89711
|
+
}
|
|
89712
|
+
function textoDe(datos) {
|
|
89713
|
+
try {
|
|
89714
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(datos).trim();
|
|
89715
|
+
} catch {
|
|
89716
|
+
return new TextDecoder("latin1").decode(datos).trim();
|
|
89717
|
+
}
|
|
89718
|
+
}
|
|
89719
|
+
function recolectar(smf, avisos) {
|
|
89720
|
+
if (smf.formato === 2) {
|
|
89721
|
+
avisos.decir(
|
|
89722
|
+
"El archivo es MIDI de formato 2 (secuencias independientes): se ley\xF3 como si todas las pistas sonaran a la vez, que es lo que hacen casi todos los programas."
|
|
89723
|
+
);
|
|
89724
|
+
}
|
|
89725
|
+
const temposCrudos = [];
|
|
89726
|
+
for (const pista of smf.pistas)
|
|
89727
|
+
for (const e of pista.eventos)
|
|
89728
|
+
if (e.tipo === "meta" && e.meta === 81 && e.datos.length >= 3) {
|
|
89729
|
+
const us = e.datos[0] << 16 | e.datos[1] << 8 | e.datos[2];
|
|
89730
|
+
if (us > 0) temposCrudos.push({ tic: e.tic, microsegundos: us });
|
|
89731
|
+
}
|
|
89732
|
+
temposCrudos.sort((a, b) => a.tic - b.tic);
|
|
89733
|
+
const reloj = armarReloj(smf, temposCrudos);
|
|
89734
|
+
const tempos = temposCrudos.map((t) => ({
|
|
89735
|
+
tic: reloj(t.tic),
|
|
89736
|
+
// ★ Redondeado a centésimas: 60 000 000 / 428 571 da 140,0002, y ese 0,0002 no lo escribió
|
|
89737
|
+
// nadie — es el redondeo del propio formato, que guarda microsegundos enteros.
|
|
89738
|
+
bpm: Math.round(6e7 / t.microsegundos * 100) / 100
|
|
89739
|
+
}));
|
|
89740
|
+
const metricas = [];
|
|
89741
|
+
const tonalidades = [];
|
|
89742
|
+
const marcadores = [];
|
|
89743
|
+
const nombres = /* @__PURE__ */ new Map();
|
|
89744
|
+
const instrumentos = /* @__PURE__ */ new Map();
|
|
89745
|
+
let letras = 0;
|
|
89746
|
+
let textos = 0;
|
|
89747
|
+
for (const [indice, pista] of smf.pistas.entries()) {
|
|
89748
|
+
for (const e of pista.eventos) {
|
|
89749
|
+
if (e.tipo !== "meta") continue;
|
|
89750
|
+
const tic = reloj(e.tic);
|
|
89751
|
+
switch (e.meta) {
|
|
89752
|
+
case 88:
|
|
89753
|
+
if (e.datos.length >= 2) {
|
|
89754
|
+
const numerador = e.datos[0];
|
|
89755
|
+
const potencia = e.datos[1];
|
|
89756
|
+
const denominador = 2 ** potencia;
|
|
89757
|
+
if (numerador >= 1 && numerador <= 32 && denominador >= 1 && denominador <= 32) {
|
|
89758
|
+
metricas.push({ tic, numerador, denominador });
|
|
89759
|
+
} else {
|
|
89760
|
+
avisos.contar("metrica-imposible");
|
|
89761
|
+
}
|
|
89762
|
+
}
|
|
89763
|
+
break;
|
|
89764
|
+
case 89:
|
|
89765
|
+
if (e.datos.length >= 2) {
|
|
89766
|
+
const alteraciones = e.datos[0] << 24 >> 24;
|
|
89767
|
+
if (alteraciones >= -7 && alteraciones <= 7) tonalidades.push({ tic, alteraciones, menor: e.datos[1] === 1 });
|
|
89768
|
+
}
|
|
89769
|
+
break;
|
|
89770
|
+
case 3:
|
|
89771
|
+
if (!nombres.has(indice)) nombres.set(indice, textoDe(e.datos));
|
|
89772
|
+
break;
|
|
89773
|
+
case 4:
|
|
89774
|
+
if (!instrumentos.has(indice)) instrumentos.set(indice, textoDe(e.datos));
|
|
89775
|
+
break;
|
|
89776
|
+
case 6: {
|
|
89777
|
+
const texto4 = textoDe(e.datos);
|
|
89778
|
+
if (texto4) marcadores.push({ tic, texto: texto4 });
|
|
89779
|
+
break;
|
|
89780
|
+
}
|
|
89781
|
+
case 5:
|
|
89782
|
+
letras++;
|
|
89783
|
+
break;
|
|
89784
|
+
case 1:
|
|
89785
|
+
case 2:
|
|
89786
|
+
case 7:
|
|
89787
|
+
textos++;
|
|
89788
|
+
break;
|
|
89789
|
+
}
|
|
89790
|
+
}
|
|
89791
|
+
}
|
|
89792
|
+
metricas.sort((a, b) => a.tic - b.tic);
|
|
89793
|
+
tonalidades.sort((a, b) => a.tic - b.tic);
|
|
89794
|
+
marcadores.sort((a, b) => a.tic - b.tic);
|
|
89795
|
+
if (avisos.cuantas("metrica-imposible") > 0) {
|
|
89796
|
+
avisos.decir(`${avisos.cuantas("metrica-imposible")} cambio(s) de m\xE9trica con valores imposibles se ignoraron.`);
|
|
89797
|
+
}
|
|
89798
|
+
if (letras > 0) {
|
|
89799
|
+
avisos.decir(`El archivo trae ${letras} s\xEDlaba(s) de letra: todav\xEDa no se importan desde MIDI.`);
|
|
89800
|
+
}
|
|
89801
|
+
if (textos > 0) {
|
|
89802
|
+
avisos.decir(`El archivo trae ${textos} texto(s) sueltos (comentarios, derechos, indicaciones): no se importaron.`);
|
|
89803
|
+
}
|
|
89804
|
+
const porPista = [];
|
|
89805
|
+
const programas = [];
|
|
89806
|
+
const controles = [];
|
|
89807
|
+
let sinCerrar = 0;
|
|
89808
|
+
let pedal = 0;
|
|
89809
|
+
let bends = 0;
|
|
89810
|
+
let presiones = 0;
|
|
89811
|
+
let otrosControles = 0;
|
|
89812
|
+
let sysex = 0;
|
|
89813
|
+
for (const [indice, pista] of smf.pistas.entries()) {
|
|
89814
|
+
const notas = [];
|
|
89815
|
+
const abiertas = /* @__PURE__ */ new Map();
|
|
89816
|
+
for (const e of pista.eventos) {
|
|
89817
|
+
switch (e.tipo) {
|
|
89818
|
+
case "nota": {
|
|
89819
|
+
const clave = e.canal * 128 + e.altura;
|
|
89820
|
+
if (e.velocidad > 0) {
|
|
89821
|
+
const cola = abiertas.get(clave) ?? [];
|
|
89822
|
+
cola.push({ tic: e.tic, velocidad: e.velocidad });
|
|
89823
|
+
abiertas.set(clave, cola);
|
|
89824
|
+
} else {
|
|
89825
|
+
const abierta2 = abiertas.get(clave)?.shift();
|
|
89826
|
+
if (abierta2) notas.push({ ini: reloj(abierta2.tic), fin: reloj(e.tic), altura: e.altura, velocidad: abierta2.velocidad, canal: e.canal });
|
|
89827
|
+
}
|
|
89828
|
+
break;
|
|
89829
|
+
}
|
|
89830
|
+
case "programa":
|
|
89831
|
+
programas.push({ pista: indice, canal: e.canal, tic: e.tic, programa: e.programa });
|
|
89832
|
+
break;
|
|
89833
|
+
case "control":
|
|
89834
|
+
if (e.control === 7 || e.control === 10) controles.push({ pista: indice, canal: e.canal, tic: e.tic, control: e.control, valor: e.valor });
|
|
89835
|
+
else if (e.control === 64) {
|
|
89836
|
+
if (e.valor >= 64) pedal++;
|
|
89837
|
+
} else if (!CONTROLES_QUE_NO_SON_MUSICA.has(e.control) && e.control < 120 && !(e.control === 1 && e.valor === 0) && !(e.control === 11 && e.valor === 127)) otrosControles++;
|
|
89838
|
+
break;
|
|
89839
|
+
case "bend":
|
|
89840
|
+
if (e.valor !== 8192) bends++;
|
|
89841
|
+
break;
|
|
89842
|
+
case "presion":
|
|
89843
|
+
presiones++;
|
|
89844
|
+
break;
|
|
89845
|
+
case "sysex":
|
|
89846
|
+
sysex++;
|
|
89847
|
+
break;
|
|
89848
|
+
}
|
|
89849
|
+
}
|
|
89850
|
+
for (const [clave, cola] of abiertas)
|
|
89851
|
+
for (const abierta2 of cola) {
|
|
89852
|
+
sinCerrar++;
|
|
89853
|
+
notas.push({ ini: reloj(abierta2.tic), fin: reloj(pista.fin), altura: clave % 128, velocidad: abierta2.velocidad, canal: Math.floor(clave / 128) });
|
|
89854
|
+
}
|
|
89855
|
+
porPista.push(notas);
|
|
89856
|
+
}
|
|
89857
|
+
if (sinCerrar > 0) avisos.decir(`${sinCerrar} nota(s) no se apagaban nunca: se cortaron donde termina su pista.`);
|
|
89858
|
+
if (pedal > 0) avisos.decir("El archivo usa el pedal de resonancia: no se importa desde MIDI, y las notas duran lo que dura la tecla apretada.");
|
|
89859
|
+
if (bends > 0) avisos.decir(`El archivo trae ${bends} movimiento(s) de pitch bend (bends, vibratos, glissandos): no se importan.`);
|
|
89860
|
+
if (presiones > 0) avisos.decir(`El archivo trae ${presiones} evento(s) de presi\xF3n (aftertouch): no se importan.`);
|
|
89861
|
+
if (otrosControles > 0) avisos.decir(`El archivo trae ${otrosControles} cambio(s) de controladores (expresi\xF3n, modulaci\xF3n\u2026): no se importan; s\xED el volumen y el paneo iniciales.`);
|
|
89862
|
+
if (sysex > 0) avisos.decir(`El archivo trae ${sysex} mensaje(s) de sistema exclusivo, propios de un sintetizador: no se importan.`);
|
|
89863
|
+
const programaEn = (pista, canal, tic) => {
|
|
89864
|
+
let deLaPista = null;
|
|
89865
|
+
let deCualquiera = null;
|
|
89866
|
+
for (const p of programas) {
|
|
89867
|
+
if (p.canal !== canal || p.tic > tic) continue;
|
|
89868
|
+
if (p.pista === pista) deLaPista = p.programa;
|
|
89869
|
+
else deCualquiera = p.programa;
|
|
89870
|
+
}
|
|
89871
|
+
return deLaPista ?? deCualquiera ?? 0;
|
|
89872
|
+
};
|
|
89873
|
+
const controlInicial = (pista, canal, control, hasta) => {
|
|
89874
|
+
let valor = null;
|
|
89875
|
+
for (const c of controles) {
|
|
89876
|
+
if (c.canal !== canal || c.control !== control || c.tic > hasta) continue;
|
|
89877
|
+
if (c.pista === pista || valor === null) valor = c.valor;
|
|
89878
|
+
}
|
|
89879
|
+
return valor;
|
|
89880
|
+
};
|
|
89881
|
+
const grupos = [];
|
|
89882
|
+
for (const [indice, notas] of porPista.entries()) {
|
|
89883
|
+
const porCanal = /* @__PURE__ */ new Map();
|
|
89884
|
+
for (const n of notas) {
|
|
89885
|
+
const lista2 = porCanal.get(n.canal) ?? [];
|
|
89886
|
+
lista2.push(n);
|
|
89887
|
+
porCanal.set(n.canal, lista2);
|
|
89888
|
+
}
|
|
89889
|
+
const deEstaPista = [];
|
|
89890
|
+
for (const canal of [...porCanal.keys()].sort((a, b) => a - b)) {
|
|
89891
|
+
const lista2 = porCanal.get(canal);
|
|
89892
|
+
let ticCrudoDeLaPrimera = Infinity;
|
|
89893
|
+
for (const e of smf.pistas[indice].eventos) {
|
|
89894
|
+
if (e.tipo === "nota" && e.canal === canal && e.velocidad > 0) {
|
|
89895
|
+
ticCrudoDeLaPrimera = e.tic;
|
|
89896
|
+
break;
|
|
89897
|
+
}
|
|
89898
|
+
}
|
|
89899
|
+
const esBateria = canal === 9;
|
|
89900
|
+
const programa = esBateria ? 0 : programaEn(indice, canal, ticCrudoDeLaPrimera);
|
|
89901
|
+
const cambia = !esBateria && programas.some((p) => p.canal === canal && p.pista === indice && p.tic > ticCrudoDeLaPrimera && p.programa !== programa);
|
|
89902
|
+
if (cambia) avisos.contar("cambio-de-programa");
|
|
89903
|
+
const existente = smf.formato !== 0 && !esBateria ? deEstaPista.find((g) => !g.esBateria && g.programa === programa) : void 0;
|
|
89904
|
+
const volumen = controlInicial(indice, canal, 7, ticCrudoDeLaPrimera);
|
|
89905
|
+
const paneo = controlInicial(indice, canal, 10, ticCrudoDeLaPrimera);
|
|
89906
|
+
if (existente) {
|
|
89907
|
+
existente.canales.push(canal);
|
|
89908
|
+
existente.notas.push(...lista2);
|
|
89909
|
+
continue;
|
|
89910
|
+
}
|
|
89911
|
+
deEstaPista.push({ pista: indice, canales: [canal], esBateria, programa, nombre: "", volumen, paneo, notas: [...lista2] });
|
|
89912
|
+
}
|
|
89913
|
+
const nombreDeLaPista = smf.formato === 0 ? "" : nombres.get(indice) || instrumentos.get(indice) || "";
|
|
89914
|
+
for (const g of deEstaPista) {
|
|
89915
|
+
const delPrograma = g.esBateria ? "Bater\xEDa" : NOMBRES_GM[g.programa];
|
|
89916
|
+
g.nombre = nombreDeLaPista ? deEstaPista.length > 1 ? `${nombreDeLaPista} (${delPrograma})` : nombreDeLaPista : delPrograma;
|
|
89917
|
+
}
|
|
89918
|
+
grupos.push(...deEstaPista);
|
|
89919
|
+
}
|
|
89920
|
+
if (avisos.cuantas("cambio-de-programa") > 0) {
|
|
89921
|
+
avisos.decir(
|
|
89922
|
+
`${avisos.cuantas("cambio-de-programa")} pista(s) cambian de instrumento a mitad de la obra: se us\xF3 el primero. Tabs lleva un instrumento por pista.`
|
|
89923
|
+
);
|
|
89924
|
+
}
|
|
89925
|
+
const repetidos = /* @__PURE__ */ new Map();
|
|
89926
|
+
for (const g of grupos) repetidos.set(g.nombre, (repetidos.get(g.nombre) ?? 0) + 1);
|
|
89927
|
+
const vistos = /* @__PURE__ */ new Map();
|
|
89928
|
+
for (const g of grupos) {
|
|
89929
|
+
if ((repetidos.get(g.nombre) ?? 0) < 2) continue;
|
|
89930
|
+
const n = (vistos.get(g.nombre) ?? 0) + 1;
|
|
89931
|
+
vistos.set(g.nombre, n);
|
|
89932
|
+
g.nombre = `${g.nombre} ${n}`;
|
|
89933
|
+
}
|
|
89934
|
+
let titulo = "";
|
|
89935
|
+
if (smf.formato === 0) titulo = nombres.get(0) ?? "";
|
|
89936
|
+
else {
|
|
89937
|
+
const director = porPista.findIndex((n, i2) => n.length === 0 && (nombres.get(i2) ?? "") !== "");
|
|
89938
|
+
if (director >= 0) titulo = nombres.get(director) ?? "";
|
|
89939
|
+
}
|
|
89940
|
+
for (const g of grupos) {
|
|
89941
|
+
g.volumen = g.volumen === null ? null : Math.round(g.volumen / 127 * 16);
|
|
89942
|
+
g.paneo = g.paneo === null ? null : Math.round(g.paneo / 127 * 16);
|
|
89943
|
+
}
|
|
89944
|
+
return { titulo, grupos, tempos, metricas, tonalidades, marcadores };
|
|
89945
|
+
}
|
|
89946
|
+
function armarReloj(smf, tempos) {
|
|
89947
|
+
if (!smf.smpte) return (tic) => tic * TICS_POR_NEGRA3 / smf.division;
|
|
89948
|
+
const porSegundo = smf.smpte.cuadrosPorSegundo * smf.smpte.ticsPorCuadro;
|
|
89949
|
+
const puntos = [{ segundo: 0, negras: 0, usPorNegra: 5e5 }];
|
|
89950
|
+
for (const t of tempos) {
|
|
89951
|
+
const anterior = puntos[puntos.length - 1];
|
|
89952
|
+
const segundo = t.tic / porSegundo;
|
|
89953
|
+
const negras = anterior.negras + (segundo - anterior.segundo) * 1e6 / anterior.usPorNegra;
|
|
89954
|
+
if (segundo === anterior.segundo) puntos[puntos.length - 1] = { segundo, negras: anterior.negras, usPorNegra: t.microsegundos };
|
|
89955
|
+
else puntos.push({ segundo, negras, usPorNegra: t.microsegundos });
|
|
89956
|
+
}
|
|
89957
|
+
return (tic) => {
|
|
89958
|
+
const segundo = tic / porSegundo;
|
|
89959
|
+
let punto = puntos[0];
|
|
89960
|
+
for (const p of puntos) if (p.segundo <= segundo) punto = p;
|
|
89961
|
+
return (punto.negras + (segundo - punto.segundo) * 1e6 / punto.usPorNegra) * TICS_POR_NEGRA3;
|
|
89962
|
+
};
|
|
89963
|
+
}
|
|
89964
|
+
function armarCompases(leido, hasta, avisos) {
|
|
89965
|
+
const compases = [];
|
|
89966
|
+
let numerador = 4;
|
|
89967
|
+
let denominador = 4;
|
|
89968
|
+
let cursor = 0;
|
|
89969
|
+
let siguiente = 0;
|
|
89970
|
+
let corridos = 0;
|
|
89971
|
+
while (compases.length === 0 || cursor < hasta) {
|
|
89972
|
+
const largo = TICS_POR_NEGRA3 * 4 * numerador / denominador;
|
|
89973
|
+
while (siguiente < leido.metricas.length && leido.metricas[siguiente].tic < cursor + largo - 0.5) {
|
|
89974
|
+
const m = leido.metricas[siguiente];
|
|
89975
|
+
if (m.tic > cursor + 0.5 && (m.numerador !== numerador || m.denominador !== denominador)) {
|
|
89976
|
+
corridos++;
|
|
89977
|
+
break;
|
|
89978
|
+
}
|
|
89979
|
+
numerador = m.numerador;
|
|
89980
|
+
denominador = m.denominador;
|
|
89981
|
+
siguiente++;
|
|
89982
|
+
}
|
|
89983
|
+
const largoFinal = TICS_POR_NEGRA3 * 4 * numerador / denominador;
|
|
89984
|
+
compases.push({ inicio: cursor, fin: cursor + largoFinal, numerador, denominador });
|
|
89985
|
+
cursor += largoFinal;
|
|
89986
|
+
if (siguiente < leido.metricas.length && leido.metricas[siguiente].tic < cursor) {
|
|
89987
|
+
const m = leido.metricas[siguiente];
|
|
89988
|
+
numerador = m.numerador;
|
|
89989
|
+
denominador = m.denominador;
|
|
89990
|
+
siguiente++;
|
|
89991
|
+
}
|
|
89992
|
+
if (compases.length > 2e4) break;
|
|
89993
|
+
}
|
|
89994
|
+
if (corridos > 0) {
|
|
89995
|
+
avisos.decir(`${corridos} cambio(s) de m\xE9trica ca\xEDan a mitad de comp\xE1s: se aplicaron en la barra siguiente.`);
|
|
89996
|
+
}
|
|
89997
|
+
return compases;
|
|
89998
|
+
}
|
|
89999
|
+
function rejillaDe(c) {
|
|
90000
|
+
const figura = c?.rejilla ?? 16;
|
|
90001
|
+
const recta = TICS_POR_NEGRA3 * 4 / figura;
|
|
90002
|
+
const conTresillos = c?.tresillos ?? true;
|
|
90003
|
+
const nombre = figura === 8 ? "la corchea" : figura === 32 ? "la fusa" : "la semicorchea";
|
|
90004
|
+
if (figura === 8 || !conTresillos) return { recta, tresillo: null, nombre, nombreTresillo: "" };
|
|
90005
|
+
return { recta, tresillo: recta * 4 / 3, nombre, nombreTresillo: figura === 32 ? "al tresillo de semicorchea" : "al tresillo de corchea" };
|
|
90006
|
+
}
|
|
90007
|
+
function decidirVentanas(compases, comienzos, rejilla) {
|
|
90008
|
+
const ventanas = [];
|
|
90009
|
+
const ordenados = [...comienzos].sort((a, b) => a - b);
|
|
90010
|
+
let k = 0;
|
|
90011
|
+
for (const compas of compases) {
|
|
90012
|
+
for (let inicio = compas.inicio; inicio < compas.fin - 0.5; inicio += TICS_POR_NEGRA3) {
|
|
90013
|
+
const fin = Math.min(inicio + TICS_POR_NEGRA3, compas.fin);
|
|
90014
|
+
let tresillo = false;
|
|
90015
|
+
if (rejilla.tresillo !== null && fin - inicio === TICS_POR_NEGRA3) {
|
|
90016
|
+
while (k < ordenados.length && ordenados[k] < inicio) k++;
|
|
90017
|
+
let errorRecto = 0;
|
|
90018
|
+
let errorTresillo = 0;
|
|
90019
|
+
let fueraDeLaRecta = false;
|
|
90020
|
+
for (let j = k; j < ordenados.length && ordenados[j] < fin; j++) {
|
|
90021
|
+
const desde = ordenados[j] - inicio;
|
|
90022
|
+
errorRecto += Math.abs(desde - Math.round(desde / rejilla.recta) * rejilla.recta);
|
|
90023
|
+
const enTresillo = Math.round(desde / rejilla.tresillo) * rejilla.tresillo;
|
|
90024
|
+
errorTresillo += Math.abs(desde - enTresillo);
|
|
90025
|
+
if (enTresillo % rejilla.recta !== 0) fueraDeLaRecta = true;
|
|
90026
|
+
}
|
|
90027
|
+
tresillo = fueraDeLaRecta && errorTresillo < errorRecto * 0.5;
|
|
90028
|
+
}
|
|
90029
|
+
ventanas.push({ inicio, fin, paso: tresillo ? rejilla.tresillo : rejilla.recta, tresillo });
|
|
90030
|
+
}
|
|
90031
|
+
}
|
|
90032
|
+
return ventanas;
|
|
90033
|
+
}
|
|
90034
|
+
function ventanaEn(ventanas, tic) {
|
|
90035
|
+
let bajo = 0;
|
|
90036
|
+
let alto = ventanas.length - 1;
|
|
90037
|
+
while (bajo < alto) {
|
|
90038
|
+
const medio = bajo + alto + 1 >> 1;
|
|
90039
|
+
if (ventanas[medio].inicio <= tic) bajo = medio;
|
|
90040
|
+
else alto = medio - 1;
|
|
90041
|
+
}
|
|
90042
|
+
return ventanas[bajo];
|
|
90043
|
+
}
|
|
90044
|
+
function cuantizar(ventanas, tic) {
|
|
90045
|
+
const v = ventanaEn(ventanas, tic);
|
|
90046
|
+
const punto = v.inicio + Math.round((tic - v.inicio) / v.paso) * v.paso;
|
|
90047
|
+
return Math.min(Math.max(punto, v.inicio), v.fin);
|
|
90048
|
+
}
|
|
90049
|
+
function pasoEn(ventanas, tic) {
|
|
90050
|
+
const v = ventanaEn(ventanas, tic);
|
|
90051
|
+
return Math.min(v.paso, v.fin - tic);
|
|
90052
|
+
}
|
|
90053
|
+
function claseDe(g) {
|
|
90054
|
+
if (g.esBateria) return "bateria";
|
|
90055
|
+
if (g.programa >= 24 && g.programa <= 31) return "guitarra";
|
|
90056
|
+
if (g.programa >= 32 && g.programa <= 39) return "bajo";
|
|
90057
|
+
if (g.programa <= 7) return "piano";
|
|
90058
|
+
return "altura";
|
|
90059
|
+
}
|
|
90060
|
+
function digitar(alturas, afinacion, ocupadas) {
|
|
90061
|
+
const conOcupadas = mejorDigitacion(alturas, afinacion, ocupadas);
|
|
90062
|
+
const colocadas = (d) => d.filter((c) => c !== null).length;
|
|
90063
|
+
if (ocupadas.size === 0 || colocadas(conOcupadas) === alturas.length) return conOcupadas;
|
|
90064
|
+
const sinOcupadas = mejorDigitacion(alturas, afinacion, /* @__PURE__ */ new Set());
|
|
90065
|
+
return colocadas(sinOcupadas) > colocadas(conOcupadas) ? sinOcupadas : conOcupadas;
|
|
90066
|
+
}
|
|
90067
|
+
function mejorDigitacion(alturas, afinacion, prohibidas) {
|
|
90068
|
+
let mejor = null;
|
|
90069
|
+
const actual = [];
|
|
90070
|
+
const usadas = /* @__PURE__ */ new Set();
|
|
90071
|
+
const probar = (i2, colocadas, maximo, suma) => {
|
|
90072
|
+
if (i2 === alturas.length) {
|
|
90073
|
+
if (!mejor || colocadas > mejor.colocadas || colocadas === mejor.colocadas && (maximo < mejor.maximo || maximo === mejor.maximo && suma < mejor.suma)) {
|
|
90074
|
+
mejor = { cuerdas: [...actual], colocadas, maximo, suma };
|
|
90075
|
+
}
|
|
90076
|
+
return;
|
|
90077
|
+
}
|
|
90078
|
+
for (let cuerda = 1; cuerda <= afinacion.length; cuerda++) {
|
|
90079
|
+
if (usadas.has(cuerda) || prohibidas.has(cuerda)) continue;
|
|
90080
|
+
const traste = alturas[i2] - afinacion[cuerda - 1];
|
|
90081
|
+
if (traste < 0 || traste > TRASTES) continue;
|
|
90082
|
+
usadas.add(cuerda);
|
|
90083
|
+
actual.push(cuerda);
|
|
90084
|
+
probar(i2 + 1, colocadas + 1, Math.max(maximo, traste), suma + traste);
|
|
90085
|
+
actual.pop();
|
|
90086
|
+
usadas.delete(cuerda);
|
|
90087
|
+
}
|
|
90088
|
+
actual.push(null);
|
|
90089
|
+
probar(i2 + 1, colocadas, maximo, suma);
|
|
90090
|
+
actual.pop();
|
|
90091
|
+
};
|
|
90092
|
+
probar(0, 0, 0, 0);
|
|
90093
|
+
return mejor.cuerdas;
|
|
90094
|
+
}
|
|
90095
|
+
function repartirEnVoces(notas, ventanas, avisos, digitarEn) {
|
|
90096
|
+
const voces = [];
|
|
90097
|
+
const porComienzo = /* @__PURE__ */ new Map();
|
|
90098
|
+
for (const n of notas) {
|
|
90099
|
+
const lista2 = porComienzo.get(n.ini) ?? [];
|
|
90100
|
+
lista2.push(n);
|
|
90101
|
+
porComienzo.set(n.ini, lista2);
|
|
90102
|
+
}
|
|
90103
|
+
for (const ini of [...porComienzo.keys()].sort((a, b) => a - b)) {
|
|
90104
|
+
let juntas = porComienzo.get(ini);
|
|
90105
|
+
const paso = pasoEn(ventanas, ini);
|
|
90106
|
+
if (digitarEn) {
|
|
90107
|
+
const ocupadas = /* @__PURE__ */ new Set();
|
|
90108
|
+
for (const voz of voces) {
|
|
90109
|
+
const ultimo = voz[voz.length - 1];
|
|
90110
|
+
if (ultimo && ultimo.fin > ini) for (const n of ultimo.notas) ocupadas.add(n.cuerda);
|
|
90111
|
+
}
|
|
90112
|
+
juntas = [...juntas].sort((a, b) => b.altura - a.altura);
|
|
90113
|
+
const cuerdas = digitarEn(juntas.map((n) => n.altura), ocupadas);
|
|
90114
|
+
const entran = [];
|
|
90115
|
+
juntas.forEach((n, i2) => {
|
|
90116
|
+
const cuerda = cuerdas[i2];
|
|
90117
|
+
if (cuerda === null || cuerda === void 0) avisos.contar("sin-cuerda");
|
|
90118
|
+
else entran.push({ ...n, cuerda });
|
|
90119
|
+
});
|
|
90120
|
+
juntas = entran;
|
|
90121
|
+
if (juntas.length === 0) continue;
|
|
90122
|
+
}
|
|
90123
|
+
const subgrupos = [];
|
|
90124
|
+
for (const n of [...juntas].sort((a, b) => b.fin - a.fin)) {
|
|
90125
|
+
const cerca = subgrupos.find((s) => Math.abs(s.fin - n.fin) <= paso);
|
|
90126
|
+
if (cerca) {
|
|
90127
|
+
if (cerca.fin !== n.fin) avisos.contar("duracion-ajustada");
|
|
90128
|
+
cerca.notas.push(n);
|
|
90129
|
+
} else subgrupos.push({ fin: n.fin, notas: [n] });
|
|
90130
|
+
}
|
|
90131
|
+
subgrupos.sort((a, b) => Math.max(...b.notas.map((n) => n.altura)) - Math.max(...a.notas.map((n) => n.altura)));
|
|
90132
|
+
for (const s of subgrupos) {
|
|
90133
|
+
const libreDesde = (v) => v[v.length - 1]?.fin ?? 0;
|
|
90134
|
+
let voz = voces.find((v) => libreDesde(v) <= ini);
|
|
90135
|
+
if (!voz) {
|
|
90136
|
+
const recortable = voces.filter((v) => libreDesde(v) - ini <= paso && v[v.length - 1].ini < ini).sort((a, b) => libreDesde(a) - libreDesde(b))[0];
|
|
90137
|
+
if (recortable) {
|
|
90138
|
+
const anterior = recortable[recortable.length - 1];
|
|
90139
|
+
avisos.contar("acortadas", anterior.notas.length);
|
|
90140
|
+
anterior.fin = ini;
|
|
90141
|
+
voz = recortable;
|
|
90142
|
+
}
|
|
90143
|
+
}
|
|
90144
|
+
if (!voz && voces.length < MAXIMO_DE_VOCES) {
|
|
90145
|
+
voz = [];
|
|
90146
|
+
voces.push(voz);
|
|
90147
|
+
}
|
|
90148
|
+
if (!voz) {
|
|
90149
|
+
avisos.contar("sin-voz", s.notas.length);
|
|
90150
|
+
continue;
|
|
90151
|
+
}
|
|
90152
|
+
voz.push({ ini, fin: s.fin, notas: s.notas.map((n) => ({ ...n, fin: s.fin })) });
|
|
90153
|
+
}
|
|
90154
|
+
}
|
|
90155
|
+
return voces.length > 0 ? voces : [[]];
|
|
90156
|
+
}
|
|
90157
|
+
function figurasQueLlenan(ini, fin, ventana) {
|
|
90158
|
+
const salida = [];
|
|
90159
|
+
let resto = Math.round(fin - ini);
|
|
90160
|
+
const tresillo = ventana.tresillo && !(ini === ventana.inicio && fin === ventana.fin);
|
|
90161
|
+
const catalogo = tresillo ? FIGURAS_DE_TRESILLO : FIGURAS_RECTAS;
|
|
90162
|
+
while (resto > 0) {
|
|
90163
|
+
const f = catalogo.find((c) => c.largo <= resto + 1e-6) ?? FIGURAS_RECTAS[FIGURAS_RECTAS.length - 1];
|
|
90164
|
+
salida.push(f);
|
|
90165
|
+
resto -= f.largo;
|
|
90166
|
+
}
|
|
90167
|
+
return salida;
|
|
90168
|
+
}
|
|
90169
|
+
function armarScore(leido, opciones, avisos) {
|
|
90170
|
+
const rejilla = rejillaDe(opciones.cuantizacion);
|
|
90171
|
+
const grupos = leido.grupos.filter((g) => g.notas.length > 0);
|
|
90172
|
+
if (grupos.length === 0) {
|
|
90173
|
+
avisos.decir("El archivo no trae ninguna nota: se abri\xF3 una obra vac\xEDa con un piano.");
|
|
90174
|
+
}
|
|
90175
|
+
const medioPasoMaximo = Math.max(rejilla.recta, rejilla.tresillo ?? 0) / 2;
|
|
90176
|
+
let hasta = 0;
|
|
90177
|
+
for (const g of grupos)
|
|
90178
|
+
for (const n of g.notas) hasta = Math.max(hasta, n.fin, n.ini + medioPasoMaximo + 1);
|
|
90179
|
+
const compases = armarCompases(leido, hasta, avisos);
|
|
90180
|
+
const finDeLaObra2 = compases[compases.length - 1].fin;
|
|
90181
|
+
const compasEn = (tic) => {
|
|
90182
|
+
let i2 = 0;
|
|
90183
|
+
while (i2 + 1 < compases.length && compases[i2 + 1].inicio <= tic) i2++;
|
|
90184
|
+
return i2;
|
|
90185
|
+
};
|
|
90186
|
+
let redondeadas = 0;
|
|
90187
|
+
let hayTresillos = false;
|
|
90188
|
+
const velocidades = /* @__PURE__ */ new Set();
|
|
90189
|
+
const pistas = [];
|
|
90190
|
+
for (const grupo of grupos) {
|
|
90191
|
+
const clase = claseDe(grupo);
|
|
90192
|
+
const ventanas = decidirVentanas(compases, grupo.notas.map((n) => n.ini), rejilla);
|
|
90193
|
+
if (ventanas.some((v) => v.tresillo)) hayTresillos = true;
|
|
90194
|
+
let notas = [];
|
|
90195
|
+
for (const cruda of grupo.notas) {
|
|
90196
|
+
velocidades.add(cruda.velocidad);
|
|
90197
|
+
const ini = Math.min(cuantizar(ventanas, cruda.ini), finDeLaObra2 - pasoEn(ventanas, finDeLaObra2 - 1));
|
|
90198
|
+
let fin = cuantizar(ventanas, cruda.fin);
|
|
90199
|
+
if (fin <= ini) fin = ini + pasoEn(ventanas, ini);
|
|
90200
|
+
if (Math.abs(ini - cruda.ini) > 2) redondeadas++;
|
|
90201
|
+
else if (Math.abs(fin - cruda.fin) > 2 && clase !== "bateria") avisos.contar("duracion-ajustada");
|
|
90202
|
+
notas.push({ ini, fin: Math.min(fin, finDeLaObra2), altura: cruda.altura, cuerda: 0 });
|
|
90203
|
+
}
|
|
90204
|
+
notas.sort((a, b) => a.altura - b.altura || a.ini - b.ini || b.fin - a.fin);
|
|
90205
|
+
const limpias = [];
|
|
90206
|
+
for (const n of notas) {
|
|
90207
|
+
const anterior = limpias[limpias.length - 1];
|
|
90208
|
+
if (anterior && anterior.altura === n.altura) {
|
|
90209
|
+
if (anterior.ini === n.ini) {
|
|
90210
|
+
avisos.contar("repetidas");
|
|
90211
|
+
continue;
|
|
90212
|
+
}
|
|
90213
|
+
if (anterior.fin > n.ini) {
|
|
90214
|
+
anterior.fin = n.ini;
|
|
90215
|
+
avisos.contar("acortadas");
|
|
90216
|
+
}
|
|
90217
|
+
}
|
|
90218
|
+
limpias.push(n);
|
|
90219
|
+
}
|
|
90220
|
+
notas = limpias;
|
|
90221
|
+
const pista = { grupo, clase, ventanas, pentagramas: [], teclasDeBateria: [] };
|
|
90222
|
+
if (clase === "bateria") {
|
|
90223
|
+
pista.teclasDeBateria = [...new Set(notas.map((n) => n.altura))].sort((a, b) => a - b);
|
|
90224
|
+
const porComienzo = /* @__PURE__ */ new Map();
|
|
90225
|
+
for (const n of notas) {
|
|
90226
|
+
const lista2 = porComienzo.get(n.ini) ?? [];
|
|
90227
|
+
lista2.push(n);
|
|
90228
|
+
porComienzo.set(n.ini, lista2);
|
|
90229
|
+
}
|
|
90230
|
+
const comienzos = [...porComienzo.keys()].sort((a, b) => a - b);
|
|
90231
|
+
const eventos = comienzos.map((ini, i2) => {
|
|
90232
|
+
const finDelCompas = compases[compasEn(ini)].fin;
|
|
90233
|
+
const fin = Math.min(comienzos[i2 + 1] ?? finDelCompas, finDelCompas);
|
|
90234
|
+
return { ini, fin, notas: porComienzo.get(ini).map((n) => ({ ...n, fin })) };
|
|
90235
|
+
});
|
|
90236
|
+
pista.pentagramas.push({ voces: [eventos], clave: _barrel_exports$4.Clef.Neutral });
|
|
90237
|
+
} else if (clase === "guitarra" || clase === "bajo") {
|
|
90238
|
+
const afinacion = clase === "guitarra" ? AFINACION_GUITARRA : AFINACION_BAJO;
|
|
90239
|
+
const grave = afinacion[0];
|
|
90240
|
+
const aguda = afinacion[afinacion.length - 1] + TRASTES;
|
|
90241
|
+
const enRegistro = notas.filter((n) => n.altura >= grave && n.altura <= aguda);
|
|
90242
|
+
const fuera = notas.length - enRegistro.length;
|
|
90243
|
+
if (fuera > 0) {
|
|
90244
|
+
avisos.decir(
|
|
90245
|
+
`Se descartaron ${fuera} nota(s) fuera del registro ${clase === "guitarra" ? "de la guitarra" : "del bajo"} \xAB${grupo.nombre}\xBB (de ${nombreDeAltura(grave)} a ${nombreDeAltura(aguda)} con ${TRASTES} trastes).`
|
|
90246
|
+
);
|
|
90247
|
+
}
|
|
90248
|
+
const voces = repartirEnVoces(enRegistro, ventanas, avisos, (alturas, ocupadas) => digitar(alturas, afinacion, ocupadas));
|
|
90249
|
+
pista.pentagramas.push({ voces, clave: clase === "guitarra" ? _barrel_exports$4.Clef.G2 : _barrel_exports$4.Clef.F4 });
|
|
90250
|
+
} else if (clase === "piano") {
|
|
90251
|
+
const derecha = notas.filter((n) => n.altura >= 60);
|
|
90252
|
+
const izquierda = notas.filter((n) => n.altura < 60);
|
|
90253
|
+
pista.pentagramas.push({ voces: repartirEnVoces(derecha, ventanas, avisos, null), clave: _barrel_exports$4.Clef.G2 });
|
|
90254
|
+
pista.pentagramas.push({ voces: repartirEnVoces(izquierda, ventanas, avisos, null), clave: _barrel_exports$4.Clef.F4 });
|
|
90255
|
+
} else {
|
|
90256
|
+
const ordenadas = notas.map((n) => n.altura).sort((a, b) => a - b);
|
|
90257
|
+
const mediana = ordenadas[Math.floor(ordenadas.length / 2)] ?? 60;
|
|
90258
|
+
pista.pentagramas.push({
|
|
90259
|
+
voces: repartirEnVoces(notas, ventanas, avisos, null),
|
|
90260
|
+
clave: mediana < 55 ? _barrel_exports$4.Clef.F4 : _barrel_exports$4.Clef.G2
|
|
90261
|
+
});
|
|
90262
|
+
}
|
|
90263
|
+
pistas.push(pista);
|
|
90264
|
+
}
|
|
90265
|
+
if (redondeadas > 0) {
|
|
90266
|
+
avisos.decir(
|
|
90267
|
+
`Se redondearon ${redondeadas} nota(s) a ${rejilla.nombre}` + (hayTresillos ? ` o ${rejilla.nombreTresillo}` : "") + ": no ca\xEDan justo en la rejilla."
|
|
90268
|
+
);
|
|
90269
|
+
}
|
|
90270
|
+
if (avisos.cuantas("duracion-ajustada") > 0) {
|
|
90271
|
+
avisos.decir(`Se ajust\xF3 la duraci\xF3n de ${avisos.cuantas("duracion-ajustada")} nota(s) a la rejilla.`);
|
|
90272
|
+
}
|
|
90273
|
+
if (avisos.cuantas("acortadas") > 0) {
|
|
90274
|
+
avisos.decir(`Se acortaron ${avisos.cuantas("acortadas")} nota(s) que se pisaban con la siguiente.`);
|
|
90275
|
+
}
|
|
90276
|
+
if (avisos.cuantas("repetidas") > 0) {
|
|
90277
|
+
avisos.decir(`Se juntaron ${avisos.cuantas("repetidas")} nota(s) repetidas: la misma tecla dos veces en el mismo instante.`);
|
|
90278
|
+
}
|
|
90279
|
+
if (avisos.cuantas("sin-voz") > 0) {
|
|
90280
|
+
avisos.decir(`Se descartaron ${avisos.cuantas("sin-voz")} nota(s) porque sonaban m\xE1s de ${MAXIMO_DE_VOCES} voces a la vez en el mismo pentagrama.`);
|
|
90281
|
+
}
|
|
90282
|
+
if (avisos.cuantas("sin-cuerda") > 0) {
|
|
90283
|
+
avisos.decir(`Se descartaron ${avisos.cuantas("sin-cuerda")} nota(s) que no cab\xEDan en las cuerdas (dos notas en la misma cuerda a la vez).`);
|
|
90284
|
+
}
|
|
90285
|
+
if (velocidades.size > 1) {
|
|
90286
|
+
avisos.decir("La intensidad de cada nota (velocity) no se importa: todas quedan con el mismo matiz.");
|
|
90287
|
+
}
|
|
90288
|
+
const score = new _barrel_exports$4.Score();
|
|
90289
|
+
score.title = leido.titulo || opciones.titulo || "";
|
|
90290
|
+
score.stylesheet.hideDynamics = true;
|
|
90291
|
+
const rejillaDelTempo = pistas[0]?.ventanas ?? decidirVentanas(compases, [], rejilla);
|
|
90292
|
+
const temposPorTic = /* @__PURE__ */ new Map();
|
|
90293
|
+
for (const t of leido.tempos) {
|
|
90294
|
+
const tic = t.tic < finDeLaObra2 ? cuantizar(rejillaDelTempo, t.tic) : finDeLaObra2;
|
|
90295
|
+
if (tic < finDeLaObra2) temposPorTic.set(tic, t.bpm);
|
|
90296
|
+
}
|
|
90297
|
+
if (!temposPorTic.has(0)) temposPorTic.set(0, leido.tempos.find((t) => t.tic <= 0)?.bpm ?? 120);
|
|
90298
|
+
const cambiosDeTempo = [];
|
|
90299
|
+
for (const tic of [...temposPorTic.keys()].sort((a, b) => a - b)) {
|
|
90300
|
+
const bpm = temposPorTic.get(tic);
|
|
90301
|
+
if (cambiosDeTempo.length > 0 && cambiosDeTempo[cambiosDeTempo.length - 1].bpm === bpm) continue;
|
|
90302
|
+
cambiosDeTempo.push({ tic, bpm });
|
|
90303
|
+
}
|
|
90304
|
+
const tonalidadPorCompas = [];
|
|
90305
|
+
{
|
|
90306
|
+
let vigente = { alteraciones: 0, menor: false };
|
|
90307
|
+
let j = 0;
|
|
90308
|
+
let corridas = 0;
|
|
90309
|
+
for (const compas of compases) {
|
|
90310
|
+
while (j < leido.tonalidades.length && leido.tonalidades[j].tic < compas.fin - 0.5) {
|
|
90311
|
+
const t = leido.tonalidades[j];
|
|
90312
|
+
if (t.tic > compas.inicio + 0.5 && t.alteraciones !== vigente.alteraciones) {
|
|
90313
|
+
corridas++;
|
|
90314
|
+
break;
|
|
90315
|
+
}
|
|
90316
|
+
vigente = { alteraciones: t.alteraciones, menor: t.menor };
|
|
90317
|
+
j++;
|
|
90318
|
+
}
|
|
90319
|
+
tonalidadPorCompas.push(vigente);
|
|
90320
|
+
}
|
|
90321
|
+
if (corridas > 0) avisos.decir(`${corridas} cambio(s) de armadura ca\xEDan a mitad de comp\xE1s: se escribieron en la barra siguiente.`);
|
|
90322
|
+
}
|
|
90323
|
+
const seccionPorCompas = /* @__PURE__ */ new Map();
|
|
90324
|
+
let marcadoresDeMas = 0;
|
|
90325
|
+
for (const m of leido.marcadores) {
|
|
90326
|
+
const i2 = compasEn(m.tic);
|
|
90327
|
+
if (seccionPorCompas.has(i2)) marcadoresDeMas++;
|
|
90328
|
+
else seccionPorCompas.set(i2, m.texto);
|
|
90329
|
+
}
|
|
90330
|
+
if (marcadoresDeMas > 0) avisos.decir(`${marcadoresDeMas} marcador(es) ca\xEDan en un comp\xE1s que ya ten\xEDa uno: se guard\xF3 el primero.`);
|
|
90331
|
+
for (const [i2, compas] of compases.entries()) {
|
|
90332
|
+
const maestro = new _barrel_exports$4.MasterBar();
|
|
90333
|
+
maestro.timeSignatureNumerator = compas.numerador;
|
|
90334
|
+
maestro.timeSignatureDenominator = compas.denominador;
|
|
90335
|
+
const seccion = seccionPorCompas.get(i2);
|
|
90336
|
+
if (seccion) {
|
|
90337
|
+
maestro.section = new _barrel_exports$4.Section();
|
|
90338
|
+
maestro.section.text = seccion;
|
|
90339
|
+
maestro.section.marker = "";
|
|
90340
|
+
}
|
|
90341
|
+
for (const cambio of cambiosDeTempo) {
|
|
90342
|
+
if (cambio.tic < compas.inicio || cambio.tic >= compas.fin) continue;
|
|
90343
|
+
const automatizacion = new _barrel_exports$4.Automation();
|
|
90344
|
+
automatizacion.isLinear = false;
|
|
90345
|
+
automatizacion.type = _barrel_exports$4.AutomationType.Tempo;
|
|
90346
|
+
automatizacion.value = cambio.bpm;
|
|
90347
|
+
automatizacion.ratioPosition = (cambio.tic - compas.inicio) / (compas.fin - compas.inicio);
|
|
90348
|
+
maestro.tempoAutomations.push(automatizacion);
|
|
90349
|
+
}
|
|
90350
|
+
score.addMasterBar(maestro);
|
|
90351
|
+
}
|
|
90352
|
+
if (pistas.length === 0) {
|
|
90353
|
+
pistas.push({
|
|
90354
|
+
grupo: { pista: 0, canales: [0], esBateria: false, programa: 0, nombre: NOMBRES_GM[0], volumen: null, paneo: null, notas: [] },
|
|
90355
|
+
clase: "piano",
|
|
90356
|
+
ventanas: decidirVentanas(compases, [], rejilla),
|
|
90357
|
+
pentagramas: [{ voces: [[]], clave: _barrel_exports$4.Clef.G2 }, { voces: [[]], clave: _barrel_exports$4.Clef.F4 }],
|
|
90358
|
+
teclasDeBateria: []
|
|
90359
|
+
});
|
|
90360
|
+
}
|
|
90361
|
+
const cortesDeTempo = cambiosDeTempo.map((c) => c.tic).filter((t) => t > 0);
|
|
90362
|
+
const piezasQueFaltan = /* @__PURE__ */ new Map();
|
|
90363
|
+
for (const [indiceDePista, pista] of pistas.entries()) {
|
|
90364
|
+
const track = new _barrel_exports$4.Track();
|
|
90365
|
+
track.name = pista.grupo.nombre;
|
|
90366
|
+
track.shortName = pista.clase === "bateria" ? "bat" : NOMBRES_CORTOS_GM[Math.floor(pista.grupo.programa / 8)];
|
|
90367
|
+
track.playbackInfo.program = pista.grupo.programa;
|
|
90368
|
+
track.playbackInfo.volume = pista.grupo.volumen ?? 16;
|
|
90369
|
+
track.playbackInfo.balance = pista.grupo.paneo ?? 8;
|
|
90370
|
+
const canal = pista.clase === "bateria" ? 9 : pista.grupo.canales[0];
|
|
90371
|
+
track.playbackInfo.primaryChannel = canal;
|
|
90372
|
+
track.playbackInfo.secondaryChannel = canal;
|
|
90373
|
+
score.addTrack(track);
|
|
90374
|
+
const indiceDeTecla = /* @__PURE__ */ new Map();
|
|
90375
|
+
if (pista.clase === "bateria") {
|
|
90376
|
+
track.percussionArticulations = pista.teclasDeBateria.map((tecla, indice) => {
|
|
90377
|
+
const art = new _barrel_exports$4.InstrumentArticulation();
|
|
90378
|
+
art.elementType = `midi ${tecla}`;
|
|
90379
|
+
art.id = indice;
|
|
90380
|
+
art.outputMidiNumber = tecla;
|
|
90381
|
+
indiceDeTecla.set(tecla, indice);
|
|
90382
|
+
return art;
|
|
90383
|
+
});
|
|
90384
|
+
for (const [tecla, indice] of indiceDeTecla) {
|
|
90385
|
+
const pieza = piezaDeBateria(track, indice);
|
|
90386
|
+
const art = track.percussionArticulations[indice];
|
|
90387
|
+
if (pieza === null) {
|
|
90388
|
+
indiceDeTecla.delete(tecla);
|
|
90389
|
+
continue;
|
|
90390
|
+
}
|
|
90391
|
+
const delKit = KIT[pieza];
|
|
90392
|
+
art.staffLine = delKit.linea;
|
|
90393
|
+
art.noteHeadDefault = delKit.cabeza === "x" ? _barrel_exports$4.MusicFontSymbol.NoteheadXBlack : _barrel_exports$4.MusicFontSymbol.NoteheadBlack;
|
|
90394
|
+
art.noteHeadHalf = art.noteHeadDefault;
|
|
90395
|
+
art.noteHeadWhole = art.noteHeadDefault;
|
|
90396
|
+
}
|
|
90397
|
+
for (const voz of pista.pentagramas[0].voces)
|
|
90398
|
+
for (const evento of voz) {
|
|
90399
|
+
const quedan = evento.notas.filter((n) => indiceDeTecla.has(n.altura));
|
|
90400
|
+
for (const n of evento.notas)
|
|
90401
|
+
if (!indiceDeTecla.has(n.altura)) piezasQueFaltan.set(n.altura, (piezasQueFaltan.get(n.altura) ?? 0) + 1);
|
|
90402
|
+
evento.notas = quedan;
|
|
90403
|
+
}
|
|
90404
|
+
}
|
|
90405
|
+
for (const [numeroDePentagrama, datos] of pista.pentagramas.entries()) {
|
|
90406
|
+
const staff = new _barrel_exports$4.Staff();
|
|
90407
|
+
const esDeTrastes = pista.clase === "guitarra" || pista.clase === "bajo";
|
|
90408
|
+
const afinacion = pista.clase === "guitarra" ? AFINACION_GUITARRA : pista.clase === "bajo" ? AFINACION_BAJO : [];
|
|
90409
|
+
const descendente = [...afinacion].reverse();
|
|
90410
|
+
staff.stringTuning = _barrel_exports$4.Tuning.findTuning(descendente) ?? new _barrel_exports$4.Tuning("", descendente, false);
|
|
90411
|
+
staff.showTablature = esDeTrastes;
|
|
90412
|
+
staff.showStandardNotation = true;
|
|
90413
|
+
staff.isPercussion = pista.clase === "bateria";
|
|
90414
|
+
if (esDeTrastes) staff.displayTranspositionPitch = -12;
|
|
90415
|
+
track.addStaff(staff);
|
|
90416
|
+
const cortesDeEstaVoz0 = indiceDePista === 0 && numeroDePentagrama === 0 ? cortesDeTempo : [];
|
|
90417
|
+
const cortesDeTresillo = [];
|
|
90418
|
+
for (const v of pista.ventanas) if (v.tresillo) cortesDeTresillo.push(v.inicio, v.fin);
|
|
90419
|
+
for (const [indiceDeCompas2, compas] of compases.entries()) {
|
|
90420
|
+
const bar = new _barrel_exports$4.Bar();
|
|
90421
|
+
staff.addBar(bar);
|
|
90422
|
+
bar.clef = datos.clave;
|
|
90423
|
+
bar.clefOttava = _barrel_exports$4.Ottavia.Regular;
|
|
90424
|
+
if (!staff.isPercussion) {
|
|
90425
|
+
bar.keySignature = tonalidadPorCompas[indiceDeCompas2].alteraciones;
|
|
90426
|
+
bar.keySignatureType = tonalidadPorCompas[indiceDeCompas2].menor ? _barrel_exports$4.KeySignatureType.Minor : _barrel_exports$4.KeySignatureType.Major;
|
|
90427
|
+
}
|
|
90428
|
+
for (const [indiceDeVoz, eventos] of datos.voces.entries()) {
|
|
90429
|
+
const voice = new _barrel_exports$4.Voice();
|
|
90430
|
+
bar.addVoice(voice);
|
|
90431
|
+
llenarVoz(voice, eventos, compas, indiceDeVoz, pista, cortesDeTresillo, indiceDeVoz === 0 ? cortesDeEstaVoz0 : [], indiceDeTecla);
|
|
90432
|
+
}
|
|
90433
|
+
}
|
|
90434
|
+
}
|
|
90435
|
+
}
|
|
90436
|
+
if (piezasQueFaltan.size > 0) {
|
|
90437
|
+
const total = [...piezasQueFaltan.values()].reduce((a, b) => a + b, 0);
|
|
90438
|
+
avisos.decir(
|
|
90439
|
+
`Se descartaron ${total} golpe(s) de bater\xEDa de piezas que el kit de Tabs todav\xEDa no tiene (notas MIDI ${[...piezasQueFaltan.keys()].sort((a, b) => a - b).join(", ")}).`
|
|
90440
|
+
);
|
|
90441
|
+
}
|
|
90442
|
+
score.finish(new Settings());
|
|
90443
|
+
return score;
|
|
90444
|
+
}
|
|
90445
|
+
function llenarVoz(voice, eventos, compas, indiceDeVoz, pista, cortesDeTresillo, cortesForzados, indiceDeTecla) {
|
|
90446
|
+
const tramos = [];
|
|
90447
|
+
for (const e of eventos) {
|
|
90448
|
+
if (e.fin <= compas.inicio || e.ini >= compas.fin) continue;
|
|
90449
|
+
if (e.notas.length === 0) continue;
|
|
90450
|
+
tramos.push({
|
|
90451
|
+
ini: Math.max(e.ini, compas.inicio),
|
|
90452
|
+
fin: Math.min(e.fin, compas.fin),
|
|
90453
|
+
notas: e.notas,
|
|
90454
|
+
// ★ Empezó en un compás anterior: lo de acá es la continuación, ligada.
|
|
90455
|
+
continua: e.ini < compas.inicio
|
|
90456
|
+
});
|
|
90457
|
+
}
|
|
90458
|
+
if (tramos.length === 0 && indiceDeVoz > 0) {
|
|
90459
|
+
const vacio = new _barrel_exports$4.Beat();
|
|
90460
|
+
vacio.isEmpty = true;
|
|
90461
|
+
voice.addBeat(vacio);
|
|
90462
|
+
return;
|
|
90463
|
+
}
|
|
90464
|
+
const conSilencios = [];
|
|
90465
|
+
let cursor = compas.inicio;
|
|
90466
|
+
for (const t of tramos) {
|
|
90467
|
+
if (t.ini > cursor) conSilencios.push({ ini: cursor, fin: t.ini, notas: null, continua: false });
|
|
90468
|
+
conSilencios.push(t);
|
|
90469
|
+
cursor = t.fin;
|
|
90470
|
+
}
|
|
90471
|
+
if (cursor < compas.fin) conSilencios.push({ ini: cursor, fin: compas.fin, notas: null, continua: false });
|
|
90472
|
+
const cortes = [...cortesDeTresillo, ...cortesForzados].filter((c) => c > compas.inicio && c < compas.fin);
|
|
90473
|
+
for (const tramo of conSilencios) {
|
|
90474
|
+
const puntos = [tramo.ini, ...cortes.filter((c) => c > tramo.ini && c < tramo.fin).sort((a, b) => a - b), tramo.fin];
|
|
90475
|
+
let primera = true;
|
|
90476
|
+
for (let k = 0; k + 1 < puntos.length; k++) {
|
|
90477
|
+
const desde = puntos[k];
|
|
90478
|
+
const hastaTic = puntos[k + 1];
|
|
90479
|
+
if (hastaTic - desde < 0.5) continue;
|
|
90480
|
+
const ventana = ventanaEn(pista.ventanas, desde);
|
|
90481
|
+
for (const figura of figurasQueLlenan(desde, hastaTic, ventana)) {
|
|
90482
|
+
const beat = new _barrel_exports$4.Beat();
|
|
90483
|
+
beat.duration = figura.valor;
|
|
90484
|
+
beat.dots = figura.puntillos;
|
|
90485
|
+
if (figura.tresillo) {
|
|
90486
|
+
beat.tupletNumerator = 3;
|
|
90487
|
+
beat.tupletDenominator = 2;
|
|
90488
|
+
}
|
|
90489
|
+
for (const n of tramo.notas ?? []) {
|
|
90490
|
+
const note = new _barrel_exports$4.Note();
|
|
90491
|
+
if (pista.clase === "bateria") {
|
|
90492
|
+
note.percussionArticulation = indiceDeTecla.get(n.altura);
|
|
90493
|
+
} else if (pista.clase === "guitarra" || pista.clase === "bajo") {
|
|
90494
|
+
const afinacion = pista.clase === "guitarra" ? AFINACION_GUITARRA : AFINACION_BAJO;
|
|
90495
|
+
note.string = n.cuerda;
|
|
90496
|
+
note.fret = n.altura - afinacion[n.cuerda - 1];
|
|
90497
|
+
} else {
|
|
90498
|
+
note.octave = Math.floor(n.altura / 12);
|
|
90499
|
+
note.tone = n.altura % 12;
|
|
90500
|
+
}
|
|
90501
|
+
note.isTieDestination = pista.clase !== "bateria" && (!primera || tramo.continua);
|
|
90502
|
+
beat.addNote(note);
|
|
90503
|
+
}
|
|
90504
|
+
voice.addBeat(beat);
|
|
90505
|
+
primera = false;
|
|
90506
|
+
}
|
|
90507
|
+
}
|
|
90508
|
+
}
|
|
90509
|
+
}
|
|
90510
|
+
function nombreDeAltura(altura) {
|
|
90511
|
+
return `${NOMBRES_DE_NOTA2[altura % 12]}${Math.floor(altura / 12) - 1}`;
|
|
90512
|
+
}
|
|
90513
|
+
var MidiIlegible, truncado, TICS_POR_NEGRA3, Avisos, CONTROLES_QUE_NO_SON_MUSICA, AFINACION_GUITARRA, AFINACION_BAJO, TRASTES, MAXIMO_DE_VOCES, FIGURAS_RECTAS, FIGURAS_DE_TRESILLO, NOMBRES_DE_NOTA2, NOMBRES_GM, NOMBRES_CORTOS_GM;
|
|
90514
|
+
var init_importarMidi = __esm({
|
|
90515
|
+
"packages/io/src/importarMidi.ts"() {
|
|
90516
|
+
init_alphaTab();
|
|
90517
|
+
init_src2();
|
|
90518
|
+
init_importarGp();
|
|
90519
|
+
MidiIlegible = class extends Error {
|
|
90520
|
+
constructor(mensaje) {
|
|
90521
|
+
super(mensaje);
|
|
90522
|
+
this.name = "MidiIlegible";
|
|
90523
|
+
}
|
|
90524
|
+
};
|
|
90525
|
+
truncado = (donde) => new MidiIlegible(`El archivo MIDI est\xE1 cortado o da\xF1ado (${donde}). Puede que no se haya terminado de descargar.`);
|
|
90526
|
+
TICS_POR_NEGRA3 = 960;
|
|
90527
|
+
Avisos = class {
|
|
90528
|
+
cuentas = /* @__PURE__ */ new Map();
|
|
90529
|
+
sueltos = [];
|
|
90530
|
+
contar(clave, cuantas = 1) {
|
|
90531
|
+
this.cuentas.set(clave, (this.cuentas.get(clave) ?? 0) + cuantas);
|
|
90532
|
+
}
|
|
90533
|
+
cuantas(clave) {
|
|
90534
|
+
return this.cuentas.get(clave) ?? 0;
|
|
90535
|
+
}
|
|
90536
|
+
decir(texto4) {
|
|
90537
|
+
if (!this.sueltos.includes(texto4)) this.sueltos.push(texto4);
|
|
90538
|
+
}
|
|
90539
|
+
lista() {
|
|
90540
|
+
return this.sueltos;
|
|
90541
|
+
}
|
|
90542
|
+
};
|
|
90543
|
+
CONTROLES_QUE_NO_SON_MUSICA = /* @__PURE__ */ new Set([0, 32, 6, 38, 96, 97, 98, 99, 100, 101]);
|
|
90544
|
+
AFINACION_GUITARRA = [40, 45, 50, 55, 59, 64];
|
|
90545
|
+
AFINACION_BAJO = [28, 33, 38, 43];
|
|
90546
|
+
TRASTES = 24;
|
|
90547
|
+
MAXIMO_DE_VOCES = 4;
|
|
90548
|
+
FIGURAS_RECTAS = [
|
|
90549
|
+
[1, 0],
|
|
90550
|
+
[2, 1],
|
|
90551
|
+
[2, 0],
|
|
90552
|
+
[4, 1],
|
|
90553
|
+
[4, 0],
|
|
90554
|
+
[8, 1],
|
|
90555
|
+
[8, 0],
|
|
90556
|
+
[16, 1],
|
|
90557
|
+
[16, 0],
|
|
90558
|
+
[32, 1],
|
|
90559
|
+
[32, 0],
|
|
90560
|
+
[64, 1],
|
|
90561
|
+
[64, 0],
|
|
90562
|
+
[128, 0]
|
|
90563
|
+
].map(([valor, puntillos]) => {
|
|
90564
|
+
const base = TICS_POR_NEGRA3 * 4 / valor;
|
|
90565
|
+
return { valor, puntillos, tresillo: false, largo: puntillos ? base * 1.5 : base };
|
|
90566
|
+
});
|
|
90567
|
+
FIGURAS_DE_TRESILLO = [4, 8, 16, 32].map((valor) => ({
|
|
90568
|
+
valor,
|
|
90569
|
+
puntillos: 0,
|
|
90570
|
+
tresillo: true,
|
|
90571
|
+
largo: TICS_POR_NEGRA3 * 4 / valor * (2 / 3)
|
|
90572
|
+
}));
|
|
90573
|
+
NOMBRES_DE_NOTA2 = ["do", "do\u266F", "re", "re\u266F", "mi", "fa", "fa\u266F", "sol", "sol\u266F", "la", "la\u266F", "si"];
|
|
90574
|
+
NOMBRES_GM = [
|
|
90575
|
+
// Pianos
|
|
90576
|
+
"Piano de cola",
|
|
90577
|
+
"Piano brillante",
|
|
90578
|
+
"Piano el\xE9ctrico de cola",
|
|
90579
|
+
"Piano de cantina",
|
|
90580
|
+
"Piano el\xE9ctrico",
|
|
90581
|
+
"Piano el\xE9ctrico 2",
|
|
90582
|
+
"Clavec\xEDn",
|
|
90583
|
+
"Clavinet",
|
|
90584
|
+
// Percusión afinada
|
|
90585
|
+
"Celesta",
|
|
90586
|
+
"Glockenspiel",
|
|
90587
|
+
"Caja de m\xFAsica",
|
|
90588
|
+
"Vibr\xE1fono",
|
|
90589
|
+
"Marimba",
|
|
90590
|
+
"Xil\xF3fono",
|
|
90591
|
+
"Campanas tubulares",
|
|
90592
|
+
"Dulc\xE9mele",
|
|
90593
|
+
// Órganos
|
|
90594
|
+
"\xD3rgano Hammond",
|
|
90595
|
+
"\xD3rgano percusivo",
|
|
90596
|
+
"\xD3rgano de rock",
|
|
90597
|
+
"\xD3rgano de iglesia",
|
|
90598
|
+
"Armonio",
|
|
90599
|
+
"Acorde\xF3n",
|
|
90600
|
+
"Arm\xF3nica",
|
|
90601
|
+
"Bandone\xF3n",
|
|
90602
|
+
// Guitarras
|
|
90603
|
+
"Guitarra de nailon",
|
|
90604
|
+
"Guitarra ac\xFAstica",
|
|
90605
|
+
"Guitarra el\xE9ctrica de jazz",
|
|
90606
|
+
"Guitarra el\xE9ctrica limpia",
|
|
90607
|
+
"Guitarra el\xE9ctrica apagada",
|
|
90608
|
+
"Guitarra saturada",
|
|
90609
|
+
"Guitarra distorsionada",
|
|
90610
|
+
"Arm\xF3nicos de guitarra",
|
|
90611
|
+
// Bajos
|
|
90612
|
+
"Bajo ac\xFAstico",
|
|
90613
|
+
"Bajo el\xE9ctrico",
|
|
90614
|
+
"Bajo con p\xFAa",
|
|
90615
|
+
"Bajo sin trastes",
|
|
90616
|
+
"Bajo slap",
|
|
90617
|
+
"Bajo slap 2",
|
|
90618
|
+
"Bajo sintetizado",
|
|
90619
|
+
"Bajo sintetizado 2",
|
|
90620
|
+
// Cuerdas
|
|
90621
|
+
"Viol\xEDn",
|
|
90622
|
+
"Viola",
|
|
90623
|
+
"Violonchelo",
|
|
90624
|
+
"Contrabajo",
|
|
90625
|
+
"Cuerdas en tr\xE9molo",
|
|
90626
|
+
"Cuerdas en pizzicato",
|
|
90627
|
+
"Arpa",
|
|
90628
|
+
"Timbales",
|
|
90629
|
+
// Conjuntos
|
|
90630
|
+
"Cuerdas",
|
|
90631
|
+
"Cuerdas 2",
|
|
90632
|
+
"Cuerdas sintetizadas",
|
|
90633
|
+
"Cuerdas sintetizadas 2",
|
|
90634
|
+
"Coro",
|
|
90635
|
+
"Voz",
|
|
90636
|
+
"Voz sintetizada",
|
|
90637
|
+
"Golpe de orquesta",
|
|
90638
|
+
// Metales
|
|
90639
|
+
"Trompeta",
|
|
90640
|
+
"Tromb\xF3n",
|
|
90641
|
+
"Tuba",
|
|
90642
|
+
"Trompeta con sordina",
|
|
90643
|
+
"Corno franc\xE9s",
|
|
90644
|
+
"Secci\xF3n de metales",
|
|
90645
|
+
"Metales sintetizados",
|
|
90646
|
+
"Metales sintetizados 2",
|
|
90647
|
+
// Lengüetas
|
|
90648
|
+
"Saxo soprano",
|
|
90649
|
+
"Saxo alto",
|
|
90650
|
+
"Saxo tenor",
|
|
90651
|
+
"Saxo bar\xEDtono",
|
|
90652
|
+
"Oboe",
|
|
90653
|
+
"Corno ingl\xE9s",
|
|
90654
|
+
"Fagot",
|
|
90655
|
+
"Clarinete",
|
|
90656
|
+
// Flautas
|
|
90657
|
+
"Flaut\xEDn",
|
|
90658
|
+
"Flauta",
|
|
90659
|
+
"Flauta dulce",
|
|
90660
|
+
"Flauta de pan",
|
|
90661
|
+
"Botella soplada",
|
|
90662
|
+
"Shakuhachi",
|
|
90663
|
+
"Silbido",
|
|
90664
|
+
"Ocarina",
|
|
90665
|
+
// Sintetizador solista
|
|
90666
|
+
"Sintetizador (cuadrada)",
|
|
90667
|
+
"Sintetizador (sierra)",
|
|
90668
|
+
"Sintetizador (cal\xEDope)",
|
|
90669
|
+
"Sintetizador (chiff)",
|
|
90670
|
+
"Sintetizador (charango)",
|
|
90671
|
+
"Sintetizador (voz)",
|
|
90672
|
+
"Sintetizador (quintas)",
|
|
90673
|
+
"Sintetizador (bajo y melod\xEDa)",
|
|
90674
|
+
// Colchones
|
|
90675
|
+
"Colch\xF3n new age",
|
|
90676
|
+
"Colch\xF3n c\xE1lido",
|
|
90677
|
+
"Colch\xF3n polif\xF3nico",
|
|
90678
|
+
"Colch\xF3n de coro",
|
|
90679
|
+
"Colch\xF3n de arco",
|
|
90680
|
+
"Colch\xF3n met\xE1lico",
|
|
90681
|
+
"Colch\xF3n halo",
|
|
90682
|
+
"Colch\xF3n de barrido",
|
|
90683
|
+
// Efectos de sintetizador
|
|
90684
|
+
"Efecto lluvia",
|
|
90685
|
+
"Efecto banda sonora",
|
|
90686
|
+
"Efecto cristal",
|
|
90687
|
+
"Efecto atm\xF3sfera",
|
|
90688
|
+
"Efecto brillo",
|
|
90689
|
+
"Efecto duendes",
|
|
90690
|
+
"Efecto ecos",
|
|
90691
|
+
"Efecto ciencia ficci\xF3n",
|
|
90692
|
+
// Étnicos
|
|
90693
|
+
"Sitar",
|
|
90694
|
+
"Banjo",
|
|
90695
|
+
"Shamisen",
|
|
90696
|
+
"Koto",
|
|
90697
|
+
"Kalimba",
|
|
90698
|
+
"Gaita",
|
|
90699
|
+
"Viol\xEDn folcl\xF3rico",
|
|
90700
|
+
"Shehnai",
|
|
90701
|
+
// Percusivos
|
|
90702
|
+
"Campanillas",
|
|
90703
|
+
"Agog\xF3",
|
|
90704
|
+
"Steel drum",
|
|
90705
|
+
"Caja china",
|
|
90706
|
+
"Taiko",
|
|
90707
|
+
"Tom mel\xF3dico",
|
|
90708
|
+
"Tambor sintetizado",
|
|
90709
|
+
"Platillo al rev\xE9s",
|
|
90710
|
+
// Efectos de sonido
|
|
90711
|
+
"Ruido de traste",
|
|
90712
|
+
"Respiraci\xF3n",
|
|
90713
|
+
"Olas",
|
|
90714
|
+
"P\xE1jaros",
|
|
90715
|
+
"Tel\xE9fono",
|
|
90716
|
+
"Helic\xF3ptero",
|
|
90717
|
+
"Aplausos",
|
|
90718
|
+
"Disparo"
|
|
90719
|
+
];
|
|
90720
|
+
NOMBRES_CORTOS_GM = [
|
|
90721
|
+
"pno",
|
|
90722
|
+
"perc",
|
|
90723
|
+
"\xF3rg",
|
|
90724
|
+
"gtr",
|
|
90725
|
+
"bajo",
|
|
90726
|
+
"cuer",
|
|
90727
|
+
"cuer",
|
|
90728
|
+
"met",
|
|
90729
|
+
"saxo",
|
|
90730
|
+
"fl",
|
|
90731
|
+
"sint",
|
|
90732
|
+
"sint",
|
|
90733
|
+
"sint",
|
|
90734
|
+
"\xE9tn",
|
|
90735
|
+
"perc",
|
|
90736
|
+
"efec"
|
|
90737
|
+
];
|
|
90738
|
+
}
|
|
90739
|
+
});
|
|
90740
|
+
|
|
89514
90741
|
// packages/io/src/archivoMtabs.ts
|
|
89515
90742
|
function formatoQueNecesita(documento) {
|
|
89516
90743
|
for (const pista of documento.pistas.values()) {
|
|
@@ -89623,6 +90850,254 @@ var init_archivoMtabs = __esm({
|
|
|
89623
90850
|
}
|
|
89624
90851
|
});
|
|
89625
90852
|
|
|
90853
|
+
// packages/io/src/recorridoDeRepeticiones.ts
|
|
90854
|
+
function instalarRecorridoDeRepeticiones() {
|
|
90855
|
+
const version2 = String(VersionInfo?.VersionInfo?.version ?? VersionInfo?.version ?? "");
|
|
90856
|
+
const Generador = _barrel_exports$3.MidiFileGenerator;
|
|
90857
|
+
if (!Generador || typeof Generador._playThroughSong !== "function") return false;
|
|
90858
|
+
if (Generador.__recorridoDe19) return true;
|
|
90859
|
+
if (version2 && !version2.startsWith("1.8.")) return false;
|
|
90860
|
+
Generador._playThroughSong = function(score, syncPoints, createNewSyncPoints, generateMasterBar, generateTracks, finish) {
|
|
90861
|
+
const controller = new RecorridoDeCompases(score);
|
|
90862
|
+
const playContext = {
|
|
90863
|
+
synthTick: 0,
|
|
90864
|
+
synthTime: 0,
|
|
90865
|
+
currentTempo: score.tempo,
|
|
90866
|
+
automationToSyncPoint: /* @__PURE__ */ new Map(),
|
|
90867
|
+
syncPoints,
|
|
90868
|
+
createNewSyncPoints
|
|
90869
|
+
};
|
|
90870
|
+
let previousMasterBar = null;
|
|
90871
|
+
const barOccurence = /* @__PURE__ */ new Map();
|
|
90872
|
+
while (!controller.finished) {
|
|
90873
|
+
const index = controller.index;
|
|
90874
|
+
const bar = score.masterBars[index];
|
|
90875
|
+
const currentTick = controller.currentTick;
|
|
90876
|
+
controller.processCurrent();
|
|
90877
|
+
if (controller.shouldPlay) {
|
|
90878
|
+
let occurence = barOccurence.has(index) ? barOccurence.get(index) : -1;
|
|
90879
|
+
occurence++;
|
|
90880
|
+
barOccurence.set(index, occurence);
|
|
90881
|
+
generateMasterBar(bar, previousMasterBar, currentTick, playContext.currentTempo, occurence);
|
|
90882
|
+
generateTracks(index, currentTick, bar.tempoAutomations.length > 0 ? bar.tempoAutomations[0].value : playContext.currentTempo);
|
|
90883
|
+
playContext.synthTick = currentTick;
|
|
90884
|
+
Generador._processBarTime(bar, occurence, playContext);
|
|
90885
|
+
}
|
|
90886
|
+
controller.moveNext();
|
|
90887
|
+
previousMasterBar = bar;
|
|
90888
|
+
}
|
|
90889
|
+
if (syncPoints.length > 0) {
|
|
90890
|
+
const lastSyncPoint = syncPoints[syncPoints.length - 1];
|
|
90891
|
+
const remainingTicks = controller.currentTick - lastSyncPoint.synthTick;
|
|
90892
|
+
if (remainingTicks > 0) {
|
|
90893
|
+
const p = new _barrel_exports$7.BackingTrackSyncPoint();
|
|
90894
|
+
p.masterBarIndex = previousMasterBar.index;
|
|
90895
|
+
p.masterBarOccurence = barOccurence.get(previousMasterBar.index) - 1;
|
|
90896
|
+
p.synthTick = controller.currentTick;
|
|
90897
|
+
p.synthBpm = playContext.currentTempo;
|
|
90898
|
+
if (playContext.createNewSyncPoints) {
|
|
90899
|
+
p.syncBpm = lastSyncPoint.synthBpm;
|
|
90900
|
+
p.synthBpm = lastSyncPoint.synthBpm;
|
|
90901
|
+
} else if (syncPoints.length === 1) p.syncBpm = lastSyncPoint.synthBpm;
|
|
90902
|
+
else p.syncBpm = syncPoints[syncPoints.length - 2].syncBpm;
|
|
90903
|
+
p.synthTime = lastSyncPoint.synthTime + ticksAMs(remainingTicks, lastSyncPoint.synthBpm);
|
|
90904
|
+
p.syncTime = lastSyncPoint.syncTime + ticksAMs(remainingTicks, p.syncBpm);
|
|
90905
|
+
if (!playContext.createNewSyncPoints) lastSyncPoint.updateSyncBpm(p.synthTime, p.syncTime);
|
|
90906
|
+
syncPoints.push(p);
|
|
90907
|
+
}
|
|
90908
|
+
}
|
|
90909
|
+
finish(controller.currentTick);
|
|
90910
|
+
return playContext;
|
|
90911
|
+
};
|
|
90912
|
+
Generador.__recorridoDe19 = true;
|
|
90913
|
+
return true;
|
|
90914
|
+
}
|
|
90915
|
+
var D, Repeticion, RecorridoDeCompases, ticksAMs;
|
|
90916
|
+
var init_recorridoDeRepeticiones = __esm({
|
|
90917
|
+
"packages/io/src/recorridoDeRepeticiones.ts"() {
|
|
90918
|
+
init_alphaTab();
|
|
90919
|
+
D = {
|
|
90920
|
+
TargetFine: 0,
|
|
90921
|
+
TargetSegno: 1,
|
|
90922
|
+
TargetSegnoSegno: 2,
|
|
90923
|
+
TargetCoda: 3,
|
|
90924
|
+
TargetDoubleCoda: 4,
|
|
90925
|
+
JumpDaCoda: 17,
|
|
90926
|
+
JumpDaDoubleCoda: 18
|
|
90927
|
+
};
|
|
90928
|
+
Repeticion = class {
|
|
90929
|
+
group;
|
|
90930
|
+
/** Con casillas, cada cierre termina la pasada y todos comparten el contador. */
|
|
90931
|
+
conCasillas;
|
|
90932
|
+
/** La pasada actual (desde 0): elige qué casillas suenan. */
|
|
90933
|
+
pasada = 0;
|
|
90934
|
+
/** Las repeticiones hechas por cierre (sólo sin casillas). */
|
|
90935
|
+
iteraciones;
|
|
90936
|
+
/** Las casillas del último compás que las tenía: los que no tienen, las continúan. */
|
|
90937
|
+
casillasActuales = 0;
|
|
90938
|
+
/** @param pasadaFinal si se toca como última pasada (después de un salto): sólo la última casilla. */
|
|
90939
|
+
constructor(group, pasadaFinal) {
|
|
90940
|
+
this.group = group;
|
|
90941
|
+
this.conCasillas = group.masterBars.some((m) => m.alternateEndings !== 0);
|
|
90942
|
+
this.iteraciones = group.closings.map((c) => pasadaFinal ? Math.max(0, c.repeatCount - 1) : 0);
|
|
90943
|
+
if (pasadaFinal) for (const i2 of this.iteraciones) this.pasada = Math.max(this.pasada, i2);
|
|
90944
|
+
}
|
|
90945
|
+
suena(compas) {
|
|
90946
|
+
let casillas = compas.alternateEndings;
|
|
90947
|
+
if (casillas === 0) casillas = this.casillasActuales;
|
|
90948
|
+
else this.casillasActuales = casillas;
|
|
90949
|
+
return casillas === 0 || (casillas & 1 << this.pasada) !== 0;
|
|
90950
|
+
}
|
|
90951
|
+
/** 0 = seguir, 1 = volver al comienzo de la repetición, 2 = terminó. */
|
|
90952
|
+
alCerrar(cierre, sono) {
|
|
90953
|
+
const cierres = this.group.closings;
|
|
90954
|
+
const esElUltimo = cierre === cierres[cierres.length - 1];
|
|
90955
|
+
if (this.conCasillas) {
|
|
90956
|
+
if (!sono && !esElUltimo) return 0;
|
|
90957
|
+
if (this.pasada < cierre.repeatCount - 1) {
|
|
90958
|
+
this.pasada++;
|
|
90959
|
+
this.casillasActuales = 0;
|
|
90960
|
+
return 1;
|
|
90961
|
+
}
|
|
90962
|
+
return esElUltimo ? 2 : 0;
|
|
90963
|
+
}
|
|
90964
|
+
const i2 = cierres.indexOf(cierre);
|
|
90965
|
+
if (i2 === -1) return 0;
|
|
90966
|
+
if (this.iteraciones[i2] < cierre.repeatCount - 1) {
|
|
90967
|
+
this.iteraciones[i2]++;
|
|
90968
|
+
for (let j = 0; j < i2; j++) this.iteraciones[j] = 0;
|
|
90969
|
+
this.casillasActuales = 0;
|
|
90970
|
+
return 1;
|
|
90971
|
+
}
|
|
90972
|
+
return esElUltimo ? 2 : 0;
|
|
90973
|
+
}
|
|
90974
|
+
/** Si algún cierre todavía va a volver por encima de este compás. */
|
|
90975
|
+
vaAVolver(compas) {
|
|
90976
|
+
const cierres = this.group.closings;
|
|
90977
|
+
for (let i2 = 0; i2 < cierres.length; i2++) {
|
|
90978
|
+
const cierre = cierres[i2];
|
|
90979
|
+
if (cierre.index >= compas.index) {
|
|
90980
|
+
if ((this.conCasillas ? this.pasada : this.iteraciones[i2]) < cierre.repeatCount - 1) return true;
|
|
90981
|
+
}
|
|
90982
|
+
}
|
|
90983
|
+
return false;
|
|
90984
|
+
}
|
|
90985
|
+
};
|
|
90986
|
+
RecorridoDeCompases = class _RecorridoDeCompases {
|
|
90987
|
+
/** Los saltos en el orden en que se revisan si un compás tiene varios. */
|
|
90988
|
+
static SALTOS = [
|
|
90989
|
+
{ jump: 5, target: null, playUntil: null, continueAt: null },
|
|
90990
|
+
{ jump: 6, target: null, playUntil: D.JumpDaCoda, continueAt: D.TargetCoda },
|
|
90991
|
+
{ jump: 7, target: null, playUntil: D.JumpDaDoubleCoda, continueAt: D.TargetDoubleCoda },
|
|
90992
|
+
{ jump: 8, target: null, playUntil: D.TargetFine, continueAt: null },
|
|
90993
|
+
{ jump: 9, target: D.TargetSegno, playUntil: null, continueAt: null },
|
|
90994
|
+
{ jump: 10, target: D.TargetSegno, playUntil: D.JumpDaCoda, continueAt: D.TargetCoda },
|
|
90995
|
+
{ jump: 11, target: D.TargetSegno, playUntil: D.JumpDaDoubleCoda, continueAt: D.TargetDoubleCoda },
|
|
90996
|
+
{ jump: 12, target: D.TargetSegno, playUntil: D.TargetFine, continueAt: null },
|
|
90997
|
+
{ jump: 13, target: D.TargetSegnoSegno, playUntil: null, continueAt: null },
|
|
90998
|
+
{ jump: 14, target: D.TargetSegnoSegno, playUntil: D.JumpDaCoda, continueAt: D.TargetCoda },
|
|
90999
|
+
{ jump: 15, target: D.TargetSegnoSegno, playUntil: D.JumpDaDoubleCoda, continueAt: D.TargetDoubleCoda },
|
|
91000
|
+
{ jump: 16, target: D.TargetSegnoSegno, playUntil: D.TargetFine, continueAt: null }
|
|
91001
|
+
];
|
|
91002
|
+
score;
|
|
91003
|
+
pila = [];
|
|
91004
|
+
/** El D.C./D.S. que se siguió; null si se toca normal (antes del salto o después de la coda). */
|
|
91005
|
+
saltoActivo = null;
|
|
91006
|
+
/** Los compases cuyo salto ya se tomó: cada salto se toma una sola vez. */
|
|
91007
|
+
saltosTomados = /* @__PURE__ */ new Set();
|
|
91008
|
+
shouldPlay = true;
|
|
91009
|
+
index = 0;
|
|
91010
|
+
currentTick = 0;
|
|
91011
|
+
constructor(score) {
|
|
91012
|
+
this.score = score;
|
|
91013
|
+
}
|
|
91014
|
+
get finished() {
|
|
91015
|
+
return this.index >= this.score.masterBars.length;
|
|
91016
|
+
}
|
|
91017
|
+
processCurrent() {
|
|
91018
|
+
const compas = this.score.masterBars[this.index];
|
|
91019
|
+
this.entrarARepeticion(compas);
|
|
91020
|
+
const rep = this.pila.length > 0 ? this.pila[this.pila.length - 1] : null;
|
|
91021
|
+
this.shouldPlay = rep === null || rep.suena(compas);
|
|
91022
|
+
if (this.shouldPlay) this.currentTick += compas.calculateDuration();
|
|
91023
|
+
}
|
|
91024
|
+
moveNext() {
|
|
91025
|
+
if (this.moverConSaltos()) return;
|
|
91026
|
+
const compas = this.score.masterBars[this.index];
|
|
91027
|
+
if (this.pila.length > 0 && compas.repeatCount > 1) {
|
|
91028
|
+
const rep = this.pila[this.pila.length - 1];
|
|
91029
|
+
switch (rep.alCerrar(compas, this.shouldPlay)) {
|
|
91030
|
+
case 1:
|
|
91031
|
+
this.index = rep.group.opening.index;
|
|
91032
|
+
return;
|
|
91033
|
+
case 2:
|
|
91034
|
+
this.pila.pop();
|
|
91035
|
+
}
|
|
91036
|
+
}
|
|
91037
|
+
this.index++;
|
|
91038
|
+
}
|
|
91039
|
+
/** Empieza la repetición del compás si hace falta: al llegar a su apertura, o tras un salto que cayó adentro. */
|
|
91040
|
+
entrarARepeticion(compas) {
|
|
91041
|
+
const group = compas.repeatGroup;
|
|
91042
|
+
if (!group.isClosed || this.pila.some((r) => r.group === group)) return;
|
|
91043
|
+
const adentro = compas.index <= group.closings[group.closings.length - 1].index;
|
|
91044
|
+
if (compas === group.opening || this.saltoActivo !== null && adentro) {
|
|
91045
|
+
this.pila.push(new Repeticion(group, this.saltoActivo !== null));
|
|
91046
|
+
}
|
|
91047
|
+
}
|
|
91048
|
+
moverConSaltos() {
|
|
91049
|
+
const compas = this.score.masterBars[this.index];
|
|
91050
|
+
const dir = compas.directions;
|
|
91051
|
+
if (!this.shouldPlay || dir === null || dir === void 0 || dir.size === 0) return false;
|
|
91052
|
+
if (this.saltoActivo === null) return this.tomarSalto(compas, dir);
|
|
91053
|
+
const hasta = this.saltoActivo.playUntil;
|
|
91054
|
+
if (hasta !== null && dir.has(hasta)) return this.seguirTrasElSalto(this.saltoActivo.continueAt);
|
|
91055
|
+
return false;
|
|
91056
|
+
}
|
|
91057
|
+
tomarSalto(compas, dir) {
|
|
91058
|
+
if (this.saltosTomados.has(compas) || this.pila.some((r) => r.vaAVolver(compas))) return false;
|
|
91059
|
+
for (const salto of _RecorridoDeCompases.SALTOS) {
|
|
91060
|
+
if (!dir.has(salto.jump)) continue;
|
|
91061
|
+
const destino = salto.target === null ? 0 : this.buscar(salto.target, true);
|
|
91062
|
+
if (destino === -1) continue;
|
|
91063
|
+
this.saltosTomados.add(compas);
|
|
91064
|
+
this.saltoActivo = salto;
|
|
91065
|
+
this.pila = [];
|
|
91066
|
+
this.index = destino;
|
|
91067
|
+
return true;
|
|
91068
|
+
}
|
|
91069
|
+
return false;
|
|
91070
|
+
}
|
|
91071
|
+
seguirTrasElSalto(seguirEn) {
|
|
91072
|
+
if (seguirEn === null) {
|
|
91073
|
+
this.index = this.score.masterBars.length;
|
|
91074
|
+
return true;
|
|
91075
|
+
}
|
|
91076
|
+
const coda = this.buscar(seguirEn, false);
|
|
91077
|
+
if (coda === -1) return false;
|
|
91078
|
+
this.saltoActivo = null;
|
|
91079
|
+
this.pila = [];
|
|
91080
|
+
this.index = coda;
|
|
91081
|
+
return true;
|
|
91082
|
+
}
|
|
91083
|
+
buscar(direccion, primeroAtras) {
|
|
91084
|
+
const paso = primeroAtras ? -1 : 1;
|
|
91085
|
+
const i2 = this.buscarHacia(direccion, paso);
|
|
91086
|
+
return i2 !== -1 ? i2 : this.buscarHacia(direccion, -paso);
|
|
91087
|
+
}
|
|
91088
|
+
buscarHacia(direccion, paso) {
|
|
91089
|
+
const compases = this.score.masterBars;
|
|
91090
|
+
for (let i2 = this.index; i2 >= 0 && i2 < compases.length; i2 += paso) {
|
|
91091
|
+
const d = compases[i2].directions;
|
|
91092
|
+
if (d !== null && d !== void 0 && d.has(direccion)) return i2;
|
|
91093
|
+
}
|
|
91094
|
+
return -1;
|
|
91095
|
+
}
|
|
91096
|
+
};
|
|
91097
|
+
ticksAMs = (ticks, tempo) => ticks * (6e4 / (tempo * 960)) | 0;
|
|
91098
|
+
}
|
|
91099
|
+
});
|
|
91100
|
+
|
|
89626
91101
|
// packages/io/src/musicxml.ts
|
|
89627
91102
|
function escapar(texto4) {
|
|
89628
91103
|
return texto4.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
@@ -90090,7 +91565,7 @@ function exportarMusicXmlComprimido(score) {
|
|
|
90090
91565
|
{ mtime: FECHA_FIJA_DEL_ZIP }
|
|
90091
91566
|
);
|
|
90092
91567
|
}
|
|
90093
|
-
var DIVISIONES_POR_NEGRA, FECHA_FIJA_DEL_ZIP, PASOS, NOMBRE_DE_LA_FIGURA2, ALTERACION_POR_MODO,
|
|
91568
|
+
var DIVISIONES_POR_NEGRA, FECHA_FIJA_DEL_ZIP, PASOS, NOMBRE_DE_LA_FIGURA2, ALTERACION_POR_MODO, D2, SALTOS;
|
|
90094
91569
|
var init_musicxml = __esm({
|
|
90095
91570
|
"packages/io/src/musicxml.ts"() {
|
|
90096
91571
|
init_alphaTab();
|
|
@@ -90120,27 +91595,27 @@ var init_musicxml = __esm({
|
|
|
90120
91595
|
[256, "256th"]
|
|
90121
91596
|
]);
|
|
90122
91597
|
ALTERACION_POR_MODO = { 2: 0, 3: 1, 4: 2, 5: -1, 6: -2 };
|
|
90123
|
-
|
|
91598
|
+
D2 = _barrel_exports$4.Direction;
|
|
90124
91599
|
SALTOS = [
|
|
90125
|
-
[
|
|
90126
|
-
[
|
|
90127
|
-
[
|
|
90128
|
-
[
|
|
90129
|
-
[
|
|
90130
|
-
[
|
|
90131
|
-
[
|
|
90132
|
-
[
|
|
90133
|
-
[
|
|
90134
|
-
[
|
|
90135
|
-
[
|
|
90136
|
-
[
|
|
90137
|
-
[
|
|
90138
|
-
[
|
|
90139
|
-
[
|
|
90140
|
-
[
|
|
90141
|
-
[
|
|
90142
|
-
[
|
|
90143
|
-
[
|
|
91600
|
+
[D2.TargetSegno, { simbolo: "segno", sonido: 'segno="segno"' }],
|
|
91601
|
+
[D2.TargetSegnoSegno, { simbolo: "segno", sonido: 'segno="segno2"' }],
|
|
91602
|
+
[D2.TargetCoda, { simbolo: "coda", sonido: 'coda="coda"' }],
|
|
91603
|
+
[D2.TargetDoubleCoda, { simbolo: "coda", sonido: 'coda="coda2"' }],
|
|
91604
|
+
[D2.TargetFine, { texto: "Fine", sonido: 'fine="yes"' }],
|
|
91605
|
+
[D2.JumpDaCapo, { texto: "D.C.", sonido: 'dacapo="yes"' }],
|
|
91606
|
+
[D2.JumpDaCapoAlCoda, { texto: "D.C. al Coda", sonido: 'dacapo="yes"' }],
|
|
91607
|
+
[D2.JumpDaCapoAlDoubleCoda, { texto: "D.C. al Coda 2", sonido: 'dacapo="yes"' }],
|
|
91608
|
+
[D2.JumpDaCapoAlFine, { texto: "D.C. al Fine", sonido: 'dacapo="yes"' }],
|
|
91609
|
+
[D2.JumpDalSegno, { texto: "D.S.", sonido: 'dalsegno="segno"' }],
|
|
91610
|
+
[D2.JumpDalSegnoAlCoda, { texto: "D.S. al Coda", sonido: 'dalsegno="segno"' }],
|
|
91611
|
+
[D2.JumpDalSegnoAlDoubleCoda, { texto: "D.S. al Coda 2", sonido: 'dalsegno="segno"' }],
|
|
91612
|
+
[D2.JumpDalSegnoAlFine, { texto: "D.S. al Fine", sonido: 'dalsegno="segno"' }],
|
|
91613
|
+
[D2.JumpDalSegnoSegno, { texto: "D.S.S.", sonido: 'dalsegno="segno2"' }],
|
|
91614
|
+
[D2.JumpDalSegnoSegnoAlCoda, { texto: "D.S.S. al Coda", sonido: 'dalsegno="segno2"' }],
|
|
91615
|
+
[D2.JumpDalSegnoSegnoAlDoubleCoda, { texto: "D.S.S. al Coda 2", sonido: 'dalsegno="segno2"' }],
|
|
91616
|
+
[D2.JumpDalSegnoSegnoAlFine, { texto: "D.S.S. al Fine", sonido: 'dalsegno="segno2"' }],
|
|
91617
|
+
[D2.JumpDaCoda, { texto: "To Coda", sonido: 'tocoda="coda"' }],
|
|
91618
|
+
[D2.JumpDaDoubleCoda, { texto: "To Coda 2", sonido: 'tocoda="coda2"' }]
|
|
90144
91619
|
];
|
|
90145
91620
|
}
|
|
90146
91621
|
});
|
|
@@ -90159,6 +91634,7 @@ function exportarMidi(score) {
|
|
|
90159
91634
|
const archivo = new _barrel_exports$3.MidiFile();
|
|
90160
91635
|
archivo.format = _barrel_exports$3.MidiFileFormat.MultiTrack;
|
|
90161
91636
|
const manejador = new _barrel_exports$3.AlphaSynthMidiFileHandler(archivo, true);
|
|
91637
|
+
instalarRecorridoDeRepeticiones();
|
|
90162
91638
|
new _barrel_exports$3.MidiFileGenerator(score, null, manejador).generate();
|
|
90163
91639
|
return archivo.toBinary();
|
|
90164
91640
|
}
|
|
@@ -90180,6 +91656,7 @@ var FORMATOS_DE_EXPORTACION;
|
|
|
90180
91656
|
var init_exportar = __esm({
|
|
90181
91657
|
"packages/io/src/exportar.ts"() {
|
|
90182
91658
|
init_alphaTab();
|
|
91659
|
+
init_recorridoDeRepeticiones();
|
|
90183
91660
|
init_musicxml();
|
|
90184
91661
|
FORMATOS_DE_EXPORTACION = [
|
|
90185
91662
|
{
|
|
@@ -90226,9 +91703,11 @@ var src_exports = {};
|
|
|
90226
91703
|
__export(src_exports, {
|
|
90227
91704
|
ArchivoIlegible: () => ArchivoIlegible,
|
|
90228
91705
|
FORMATOS_DE_EXPORTACION: () => FORMATOS_DE_EXPORTACION,
|
|
91706
|
+
MidiIlegible: () => MidiIlegible,
|
|
90229
91707
|
VERSION_DEL_FORMATO: () => VERSION_DEL_FORMATO,
|
|
90230
91708
|
desempaquetar: () => desempaquetar,
|
|
90231
91709
|
empaquetar: () => empaquetar,
|
|
91710
|
+
esMidi: () => esMidi,
|
|
90232
91711
|
exportarAlphaTex: () => exportarAlphaTex,
|
|
90233
91712
|
exportarComo: () => exportarComo,
|
|
90234
91713
|
exportarGp7: () => exportarGp7,
|
|
@@ -90238,7 +91717,9 @@ __export(src_exports, {
|
|
|
90238
91717
|
formatoDeExportacion: () => formatoDeExportacion,
|
|
90239
91718
|
formatoQueNecesita: () => formatoQueNecesita,
|
|
90240
91719
|
importarGp: () => importarGp,
|
|
91720
|
+
importarMidi: () => importarMidi,
|
|
90241
91721
|
importarScore: () => importarScore,
|
|
91722
|
+
instalarRecorridoDeRepeticiones: () => instalarRecorridoDeRepeticiones,
|
|
90242
91723
|
leerOrtografia: () => leerOrtografia,
|
|
90243
91724
|
prepararMusicXml: () => prepararMusicXml,
|
|
90244
91725
|
prepararParaAlphaTab: () => prepararParaAlphaTab,
|
|
@@ -90247,10 +91728,12 @@ __export(src_exports, {
|
|
|
90247
91728
|
var init_src4 = __esm({
|
|
90248
91729
|
"packages/io/src/index.ts"() {
|
|
90249
91730
|
init_importarGp();
|
|
91731
|
+
init_importarMidi();
|
|
90250
91732
|
init_musicxmlEntrada();
|
|
90251
91733
|
init_archivoMtabs();
|
|
90252
91734
|
init_exportar();
|
|
90253
91735
|
init_musicxml();
|
|
91736
|
+
init_recorridoDeRepeticiones();
|
|
90254
91737
|
}
|
|
90255
91738
|
});
|
|
90256
91739
|
|
|
@@ -90320,6 +91803,19 @@ async function abrirDeArchivo(ruta) {
|
|
|
90320
91803
|
};
|
|
90321
91804
|
return alAbrirLaObra(abierta);
|
|
90322
91805
|
}
|
|
91806
|
+
if (EXTENSIONES_MIDI.has(extension2)) {
|
|
91807
|
+
const { importarMidi: importarMidi2 } = await Promise.resolve().then(() => (init_src4(), src_exports));
|
|
91808
|
+
const resultado = importarMidi2(bytes, { titulo: basename(ruta).replace(/.[^.]+$/, "") });
|
|
91809
|
+
abierta = {
|
|
91810
|
+
documento: resultado.documento,
|
|
91811
|
+
origen: { clase: "archivo", ruta },
|
|
91812
|
+
avisos: resultado.avisos,
|
|
91813
|
+
grabaciones: [],
|
|
91814
|
+
grabacionesEnEspera: [],
|
|
91815
|
+
fuentes: []
|
|
91816
|
+
};
|
|
91817
|
+
return alAbrirLaObra(abierta);
|
|
91818
|
+
}
|
|
90323
91819
|
if (EXTENSIONES_IMPORTABLES.has(extension2)) {
|
|
90324
91820
|
const { importarGp: importarGp2 } = await Promise.resolve().then(() => (init_src4(), src_exports));
|
|
90325
91821
|
const resultado = importarGp2(bytes);
|
|
@@ -90336,7 +91832,7 @@ async function abrirDeArchivo(ruta) {
|
|
|
90336
91832
|
return alAbrirLaObra(abierta);
|
|
90337
91833
|
}
|
|
90338
91834
|
throw new ProblemaConLaObra(
|
|
90339
|
-
`No s\xE9 abrir \xAB${basename(ruta)}\xBB: la extensi\xF3n \xAB${extension2 || "(ninguna)"}\xBB no est\xE1 soportada. Se puede abrir .mtabs (el formato de Mandioca Tabs), Guitar Pro (.gp, .gpx, .gp5, .gp4, .gp3)
|
|
91835
|
+
`No s\xE9 abrir \xAB${basename(ruta)}\xBB: la extensi\xF3n \xAB${extension2 || "(ninguna)"}\xBB no est\xE1 soportada. Se puede abrir .mtabs (el formato de Mandioca Tabs), Guitar Pro (.gp, .gpx, .gp5, .gp4, .gp3), MusicXML (.musicxml, .xml, .mxl) y MIDI (.mid, .midi).`
|
|
90340
91836
|
);
|
|
90341
91837
|
}
|
|
90342
91838
|
function abrirEnBlanco(opciones = {}) {
|
|
@@ -90464,7 +91960,7 @@ function reciboDeLaPesta\u00F1a(respuesta, ruta) {
|
|
|
90464
91960
|
...avisoDeLoQueNoSuena(mudas, 0)
|
|
90465
91961
|
};
|
|
90466
91962
|
}
|
|
90467
|
-
var ProblemaConLaObra, abierta, sigueViva, EXTENSIONES_IMPORTABLES;
|
|
91963
|
+
var ProblemaConLaObra, abierta, sigueViva, EXTENSIONES_IMPORTABLES, EXTENSIONES_MIDI;
|
|
90468
91964
|
var init_obra = __esm({
|
|
90469
91965
|
"apps/mcp/src/obra.ts"() {
|
|
90470
91966
|
"use strict";
|
|
@@ -90475,6 +91971,7 @@ var init_obra = __esm({
|
|
|
90475
91971
|
abierta = null;
|
|
90476
91972
|
sigueViva = null;
|
|
90477
91973
|
EXTENSIONES_IMPORTABLES = /* @__PURE__ */ new Set([".gp", ".gpx", ".gp5", ".gp4", ".gp3", ".musicxml", ".xml", ".mxl"]);
|
|
91974
|
+
EXTENSIONES_MIDI = /* @__PURE__ */ new Set([".mid", ".midi", ".kar", ".rmi"]);
|
|
90478
91975
|
}
|
|
90479
91976
|
});
|
|
90480
91977
|
|
|
@@ -90483,7 +91980,7 @@ var VERSION_DEL_CONECTOR;
|
|
|
90483
91980
|
var init_version = __esm({
|
|
90484
91981
|
"apps/mcp/src/version.ts"() {
|
|
90485
91982
|
"use strict";
|
|
90486
|
-
VERSION_DEL_CONECTOR = true ? "0.2.
|
|
91983
|
+
VERSION_DEL_CONECTOR = true ? "0.2.17" : null;
|
|
90487
91984
|
}
|
|
90488
91985
|
});
|
|
90489
91986
|
|
|
@@ -98346,6 +99843,51 @@ var init_marcas = __esm({
|
|
|
98346
99843
|
}
|
|
98347
99844
|
});
|
|
98348
99845
|
|
|
99846
|
+
// packages/projection/src/diagramas.ts
|
|
99847
|
+
function diagramasValidos(v) {
|
|
99848
|
+
return DIAGRAMAS_POSIBLES.includes(v) ? v : "no";
|
|
99849
|
+
}
|
|
99850
|
+
function claveDeLaForma(forma) {
|
|
99851
|
+
return [...forma].sort((a, b) => a.cuerda - b.cuerda).map((n) => `${n.cuerda}:${n.traste}`).join(" ");
|
|
99852
|
+
}
|
|
99853
|
+
function formaDibujable(forma) {
|
|
99854
|
+
if (forma.length < 2) return false;
|
|
99855
|
+
return new Set(forma.map((n) => n.cuerda)).size === forma.length;
|
|
99856
|
+
}
|
|
99857
|
+
function formasDeLaPista(golpes) {
|
|
99858
|
+
const cuentas = /* @__PURE__ */ new Map();
|
|
99859
|
+
golpes.forEach(({ nombre, forma }, orden) => {
|
|
99860
|
+
if (!formaDibujable(forma)) return;
|
|
99861
|
+
const deEste = cuentas.get(nombre) ?? /* @__PURE__ */ new Map();
|
|
99862
|
+
cuentas.set(nombre, deEste);
|
|
99863
|
+
const clave = claveDeLaForma(forma);
|
|
99864
|
+
const previa = deEste.get(clave);
|
|
99865
|
+
if (previa) previa.veces += 1;
|
|
99866
|
+
else deEste.set(clave, { forma, veces: 1, orden });
|
|
99867
|
+
});
|
|
99868
|
+
const elegidas = /* @__PURE__ */ new Map();
|
|
99869
|
+
for (const [nombre, formas] of cuentas) {
|
|
99870
|
+
const mejor = [...formas.values()].sort((a, b) => b.veces - a.veces || a.orden - b.orden)[0];
|
|
99871
|
+
if (mejor) elegidas.set(nombre, mejor.forma);
|
|
99872
|
+
}
|
|
99873
|
+
return elegidas;
|
|
99874
|
+
}
|
|
99875
|
+
function cuerdasDelDiagrama(forma, cuerdas) {
|
|
99876
|
+
const porCuerda = new Map(forma.map((n) => [n.cuerda, n.traste]));
|
|
99877
|
+
const strings = [];
|
|
99878
|
+
for (let c = cuerdas; c >= 1; c--) strings.push(porCuerda.get(c) ?? -1);
|
|
99879
|
+
const pisados = forma.map((n) => n.traste).filter((t) => t > 0);
|
|
99880
|
+
const maximo = pisados.length ? Math.max(...pisados) : 0;
|
|
99881
|
+
const firstFret = maximo <= 5 ? 1 : Math.min(...pisados);
|
|
99882
|
+
return { strings, firstFret };
|
|
99883
|
+
}
|
|
99884
|
+
var DIAGRAMAS_POSIBLES;
|
|
99885
|
+
var init_diagramas = __esm({
|
|
99886
|
+
"packages/projection/src/diagramas.ts"() {
|
|
99887
|
+
DIAGRAMAS_POSIBLES = ["no", "arriba", "partitura"];
|
|
99888
|
+
}
|
|
99889
|
+
});
|
|
99890
|
+
|
|
98349
99891
|
// packages/projection/src/estilo.ts
|
|
98350
99892
|
function comoLoEscribeCss(fuente) {
|
|
98351
99893
|
const partes = [];
|
|
@@ -98510,6 +100052,9 @@ function proyectar(documento, opciones = {}) {
|
|
|
98510
100052
|
score.album = marcado(cabecera.get("album") ?? "", marcasDe(cabecera, "album"));
|
|
98511
100053
|
const tempoDeCabecera = documento.cabecera.get("tempo") || 120;
|
|
98512
100054
|
score.stylesheet.hideDynamics = documento.cabecera.get("mostrarMatices") === false;
|
|
100055
|
+
const diagramas = diagramasValidos(documento.cabecera.get("diagramasDeAcordes"));
|
|
100056
|
+
score.stylesheet.globalDisplayChordDiagramsOnTop = diagramas === "arriba";
|
|
100057
|
+
score.stylesheet.globalDisplayChordDiagramsInScore = diagramas === "partitura";
|
|
98513
100058
|
score.stylesheet.barNumberDisplay = _barrel_exports$4.BarNumberDisplay.AllBars;
|
|
98514
100059
|
const estiloDeLaObra = documento.leerEstilo();
|
|
98515
100060
|
aplicarEstiloAlDibujo(score, ajustes, estiloDeLaObra);
|
|
@@ -98654,6 +100199,15 @@ function proyectar(documento, opciones = {}) {
|
|
|
98654
100199
|
});
|
|
98655
100200
|
acordesEscritos.sort((a, b) => a.compas - b.compas || a.tiempo - b.tiempo);
|
|
98656
100201
|
const acordeVigente = buscadorDeAcorde(acordesEscritos);
|
|
100202
|
+
const formaDelGolpe = (idFigura) => (notasPorFigura.get(idFigura) ?? []).map((n) => ({ cuerda: n.cuerda, traste: n.traste }));
|
|
100203
|
+
const formasConNombre = diagramas !== "no" && pista.tipo === "trastes" ? formasDeLaPista(
|
|
100204
|
+
maestros.flatMap(
|
|
100205
|
+
(m) => deLaPista.flatMap((mapa) => {
|
|
100206
|
+
const id2 = mapa.get(m.id);
|
|
100207
|
+
return (id2 ? figurasPorCompas.get(id2) ?? [] : []).filter(({ datos: f }) => f.acorde).sort((a, b) => a.datos.tiempo - b.datos.tiempo).map(({ id: idFigura, datos: f }) => ({ nombre: f.acorde, forma: formaDelGolpe(idFigura) }));
|
|
100208
|
+
})
|
|
100209
|
+
)
|
|
100210
|
+
) : null;
|
|
98657
100211
|
maestros.forEach((maestro, indiceDeCompas2) => {
|
|
98658
100212
|
const barra = new _barrel_exports$4.Bar();
|
|
98659
100213
|
pentagrama.addBar(barra);
|
|
@@ -98701,15 +100255,23 @@ function proyectar(documento, opciones = {}) {
|
|
|
98701
100255
|
if (figura.texto) golpe.lyrics = [marcado(figura.texto, figura.textoSegundaTipografia)];
|
|
98702
100256
|
if (figura.acorde) {
|
|
98703
100257
|
const nombre = marcado(figura.acorde, figura.acordeSegundaTipografia);
|
|
98704
|
-
|
|
100258
|
+
const propia = formasConNombre ? formaDelGolpe(idFigura) : [];
|
|
100259
|
+
const forma = formasConNombre ? formaDibujable(propia) ? propia : formasConNombre.get(figura.acorde) : void 0;
|
|
100260
|
+
const id2 = forma ? `${nombre}|${claveDeLaForma(forma)}` : nombre;
|
|
100261
|
+
if (!pentagrama.chords?.has(id2)) {
|
|
98705
100262
|
const acorde = new _barrel_exports$4.Chord();
|
|
98706
100263
|
acorde.name = nombre;
|
|
98707
100264
|
acorde.showName = true;
|
|
98708
|
-
acorde.showDiagram =
|
|
100265
|
+
acorde.showDiagram = forma !== void 0;
|
|
100266
|
+
if (forma) {
|
|
100267
|
+
const { strings, firstFret } = cuerdasDelDiagrama(forma, pista.afinacion.length);
|
|
100268
|
+
acorde.strings = strings;
|
|
100269
|
+
acorde.firstFret = firstFret;
|
|
100270
|
+
}
|
|
98709
100271
|
acorde.staff = pentagrama;
|
|
98710
|
-
pentagrama.addChord(
|
|
100272
|
+
pentagrama.addChord(id2, acorde);
|
|
98711
100273
|
}
|
|
98712
|
-
golpe.chordId =
|
|
100274
|
+
golpe.chordId = id2;
|
|
98713
100275
|
}
|
|
98714
100276
|
golpe.dynamics = figura.dinamica;
|
|
98715
100277
|
golpe.pickStroke = figura.puaDireccion;
|
|
@@ -98908,6 +100470,7 @@ var VOCES_POR_COMPAS, volumenDeMezcla;
|
|
|
98908
100470
|
var init_proyectar = __esm({
|
|
98909
100471
|
"packages/projection/src/proyectar.ts"() {
|
|
98910
100472
|
init_alphaTab();
|
|
100473
|
+
init_diagramas();
|
|
98911
100474
|
init_estilo();
|
|
98912
100475
|
init_src3();
|
|
98913
100476
|
init_marcas();
|
|
@@ -98921,6 +100484,7 @@ var init_proyectar = __esm({
|
|
|
98921
100484
|
// packages/projection/src/index.ts
|
|
98922
100485
|
var src_exports2 = {};
|
|
98923
100486
|
__export(src_exports2, {
|
|
100487
|
+
DIAGRAMAS_POSIBLES: () => DIAGRAMAS_POSIBLES,
|
|
98924
100488
|
ELEMENTOS_QUE_DIBUJA_EL_PROGRAMA: () => ELEMENTOS_QUE_DIBUJA_EL_PROGRAMA,
|
|
98925
100489
|
ELEMENTOS_QUE_NO_SE_DIBUJAN: () => ELEMENTOS_QUE_NO_SE_DIBUJAN,
|
|
98926
100490
|
MARCA_DE_BANDA: () => MARCA_DE_BANDA,
|
|
@@ -98928,6 +100492,7 @@ __export(src_exports2, {
|
|
|
98928
100492
|
aplicarColoresAlDibujo: () => aplicarColoresAlDibujo,
|
|
98929
100493
|
aplicarEstiloAlDibujo: () => aplicarEstiloAlDibujo,
|
|
98930
100494
|
aplicarFuentesAlDibujo: () => aplicarFuentesAlDibujo,
|
|
100495
|
+
diagramasValidos: () => diagramasValidos,
|
|
98931
100496
|
fuentePropiaDe: () => fuentePropiaDe,
|
|
98932
100497
|
pasarLetraALaFila: () => pasarLetraALaFila,
|
|
98933
100498
|
presentarPistas: () => presentarPistas,
|
|
@@ -98938,6 +100503,7 @@ __export(src_exports2, {
|
|
|
98938
100503
|
var init_src5 = __esm({
|
|
98939
100504
|
"packages/projection/src/index.ts"() {
|
|
98940
100505
|
init_marcas();
|
|
100506
|
+
init_diagramas();
|
|
98941
100507
|
init_proyectar();
|
|
98942
100508
|
init_estilo();
|
|
98943
100509
|
}
|
|
@@ -123313,9 +124879,9 @@ function registrarHerramientasDelDocumento(servidor2) {
|
|
|
123313
124879
|
"abrir_obra",
|
|
123314
124880
|
{
|
|
123315
124881
|
title: "Abrir una obra",
|
|
123316
|
-
description: "Abre un archivo de partitura del disco y lo deja como la obra sobre la que trabajan las dem\xE1s herramientas. Entiende .mtabs (el formato de Mandioca Tabs), Guitar Pro (.gp, .gpx, .gp5, .gp4, .gp3)
|
|
124882
|
+
description: "Abre un archivo de partitura del disco y lo deja como la obra sobre la que trabajan las dem\xE1s herramientas. Entiende .mtabs (el formato de Mandioca Tabs), Guitar Pro (.gp, .gpx, .gp5, .gp4, .gp3), MusicXML (.musicxml, .xml, .mxl) y MIDI (.mid, .midi). \u26A0\uFE0F **Si el m\xFAsico ya tiene el programa abierto y esperando, esto NO es lo que \xE9l ve**: un archivo abierto ac\xE1 es un documento aparte. Se comprueba antes y se avisa; para trabajar sobre su pantalla, `conectar_con_la_app`.",
|
|
123317
124883
|
inputSchema: {
|
|
123318
|
-
ruta: external_exports.string().describe("La ruta completa del archivo: .mtabs, Guitar Pro (.gp, .gpx, .gp5\u2026)
|
|
124884
|
+
ruta: external_exports.string().describe("La ruta completa del archivo: .mtabs, Guitar Pro (.gp, .gpx, .gp5\u2026), MusicXML (.musicxml, .xml, .mxl) o MIDI (.mid)"),
|
|
123319
124885
|
igual: external_exports.boolean().optional().describe(
|
|
123320
124886
|
"Abrir el archivo aunque el m\xFAsico tenga el programa abierto. Sirve para trabajar sobre un archivo del disco a prop\xF3sito, sin tocar lo que \xE9l est\xE1 mirando."
|
|
123321
124887
|
)
|
|
@@ -124069,6 +125635,46 @@ function registrarHerramientasDelPuente(servidor2) {
|
|
|
124069
125635
|
},
|
|
124070
125636
|
async (args2) => texto3(await pedirALaPesta\u00F1a("metronomo", args2))
|
|
124071
125637
|
);
|
|
125638
|
+
servidor2.registerTool(
|
|
125639
|
+
"elegir_voz",
|
|
125640
|
+
{
|
|
125641
|
+
title: "Elegir en qu\xE9 voz escribe el m\xFAsico",
|
|
125642
|
+
description: "Cambia la voz del cursor en la pantalla (1 a 4): lo que el m\xFAsico teclee despu\xE9s cae en esa voz. Es el selector \xABVoz\xBB de la barra. Las herramientas que escriben ya reciben su propia `voz`; \xE9sta es para dejarle la pantalla lista. Sin decir cu\xE1l, pasa a la siguiente. Contesta la voz y d\xF3nde qued\xF3 el cursor.",
|
|
125643
|
+
inputSchema: {
|
|
125644
|
+
voz: external_exports.number().int().min(1).max(4).optional().describe("De 1 a 4. Sin esto, la siguiente.")
|
|
125645
|
+
}
|
|
125646
|
+
},
|
|
125647
|
+
async (args2) => texto3(await pedirALaPesta\u00F1a("elegir_voz", args2))
|
|
125648
|
+
);
|
|
125649
|
+
servidor2.registerTool(
|
|
125650
|
+
"bucle",
|
|
125651
|
+
{
|
|
125652
|
+
title: "Repetir un pasaje en bucle",
|
|
125653
|
+
description: "Pone o saca el bucle: la reproducci\xF3n repite esos compases una y otra vez. Con `compas` (y `hasta`) repite esos; sin ellos, el pasaje marcado en pantalla o el comp\xE1s del cursor. Sin decir nada, alterna. No se guarda en la obra. La cuenta previa y la velocidad que sube se ajustan con `practica`.",
|
|
125654
|
+
inputSchema: {
|
|
125655
|
+
puesto: external_exports.boolean().optional().describe("true lo pone, false lo saca. Sin esto, alterna."),
|
|
125656
|
+
compas: external_exports.number().int().min(1).max(9999).optional().describe("Primer comp\xE1s del tramo, desde 1."),
|
|
125657
|
+
hasta: external_exports.number().int().min(1).max(9999).optional().describe("\xDAltimo comp\xE1s del tramo, incluido.")
|
|
125658
|
+
}
|
|
125659
|
+
},
|
|
125660
|
+
async (args2) => texto3(await pedirALaPesta\u00F1a("bucle", args2))
|
|
125661
|
+
);
|
|
125662
|
+
servidor2.registerTool(
|
|
125663
|
+
"practica",
|
|
125664
|
+
{
|
|
125665
|
+
title: "Ajustes de pr\xE1ctica",
|
|
125666
|
+
description: "C\xF3mo se practica con el bucle: `cuentaPrevia` toca un comp\xE1s de clicks antes de que entre la m\xFAsica (en cada play); `subirVelocidad` hace que, con el bucle puesto, la velocidad arranque en `desde` y suba `paso` cada `cadaVueltas` vueltas hasta `hasta`. De f\xE1brica todo apagado. Es de quien toca, no de la obra. Sin nada, contesta c\xF3mo est\xE1.",
|
|
125667
|
+
inputSchema: {
|
|
125668
|
+
cuentaPrevia: external_exports.boolean().optional(),
|
|
125669
|
+
subirVelocidad: external_exports.boolean().optional(),
|
|
125670
|
+
desde: external_exports.number().min(0.25).max(1.5).optional().describe("Velocidad de la primera vuelta; 1 es la normal."),
|
|
125671
|
+
hasta: external_exports.number().min(0.25).max(1.5).optional().describe("De ah\xED no pasa."),
|
|
125672
|
+
paso: external_exports.number().min(0.01).max(0.25).optional().describe("Cu\xE1nto sube cada vez: 0,05 es 5 %."),
|
|
125673
|
+
cadaVueltas: external_exports.number().int().min(1).max(16).optional()
|
|
125674
|
+
}
|
|
125675
|
+
},
|
|
125676
|
+
async (args2) => texto3(await pedirALaPesta\u00F1a("practica", args2))
|
|
125677
|
+
);
|
|
124072
125678
|
servidor2.registerTool(
|
|
124073
125679
|
"avanzar_al_escribir",
|
|
124074
125680
|
{
|
|
@@ -124544,7 +126150,7 @@ function registrarHerramientasDelPuente(servidor2) {
|
|
|
124544
126150
|
title: "Abrir una obra en la pantalla del m\xFAsico",
|
|
124545
126151
|
description: "Abre un `.mtabs` o un `.gp` del disco **en la pesta\xF1a que el m\xFAsico tiene delante**. \u26A0\uFE0F Esto NO es `abrir_obra`: aqu\xE9lla abre el archivo como un documento aparte, que el m\xFAsico no ve. \xC9sta se lo pone en pantalla. \u26A0\uFE0F Y no es `abrir_reciente`, que s\xF3lo alcanza los de su lista: ac\xE1 va cualquier ruta. \u2605 Funciona tambi\xE9n con la pantalla de inicio abierta y ninguna obra cargada, que es para lo que se hizo. \u26A0\uFE0F\u26A0\uFE0F **Falla si hay trabajo sin guardar**, y dice cu\xE1l: abrir otra cosa encima lo perder\xEDa, y \xE9sa no es una decisi\xF3n que se tome por el m\xFAsico.",
|
|
124546
126152
|
inputSchema: {
|
|
124547
|
-
ruta: external_exports.string().min(1).describe("La ruta completa en el disco: .mtabs, Guitar Pro (.gp, .gpx, .gp5\u2026)
|
|
126153
|
+
ruta: external_exports.string().min(1).describe("La ruta completa en el disco: .mtabs, Guitar Pro (.gp, .gpx, .gp5\u2026), MusicXML (.musicxml, .xml, .mxl) o MIDI (.mid)")
|
|
124548
126154
|
}
|
|
124549
126155
|
},
|
|
124550
126156
|
async ({ ruta }) => {
|
|
@@ -125010,6 +126616,22 @@ function registrarHerramientasDeEstructura(servidor2) {
|
|
|
125010
126616
|
});
|
|
125011
126617
|
}
|
|
125012
126618
|
);
|
|
126619
|
+
servidor2.registerTool(
|
|
126620
|
+
"diagramas_de_acordes",
|
|
126621
|
+
{
|
|
126622
|
+
title: "Diagramas de acordes",
|
|
126623
|
+
description: "Si los nombres de acorde llevan su cuadrito de trastes: `no` (s\xF3lo el nombre, de f\xE1brica), `partitura` (sobre cada acorde) o `arriba` (una lista al comienzo). Se guarda en la obra. \u26A0\uFE0F El diagrama sale de lo ESCRITO: las notas del golpe, o la forma con que ese acorde est\xE1 escrito en otro lugar de la pista. Un nombre sin notas en ning\xFAn lado queda sin diagrama: el programa no inventa digitaciones. Sin decir nada, contesta c\xF3mo est\xE1.",
|
|
126624
|
+
inputSchema: {
|
|
126625
|
+
donde: external_exports.enum(["no", "partitura", "arriba"]).optional()
|
|
126626
|
+
}
|
|
126627
|
+
},
|
|
126628
|
+
({ donde }) => {
|
|
126629
|
+
const { documento } = obraAbierta();
|
|
126630
|
+
if (donde !== void 0) documento.doc.transact(() => documento.cabecera.set("diagramasDeAcordes", donde));
|
|
126631
|
+
const actual = documento.cabecera.get("diagramasDeAcordes");
|
|
126632
|
+
return texto2({ diagramasDeAcordes: actual === "partitura" || actual === "arriba" ? actual : "no" });
|
|
126633
|
+
}
|
|
126634
|
+
);
|
|
125013
126635
|
servidor2.registerTool(
|
|
125014
126636
|
"estilo_de_la_obra",
|
|
125015
126637
|
{
|