diff --git a/.idea/200_zupfnoter.iml b/.idea/200_zupfnoter.iml index a45deaf2..2eb64f85 100644 --- a/.idea/200_zupfnoter.iml +++ b/.idea/200_zupfnoter.iml @@ -1,6 +1,6 @@ - + @@ -38,7 +38,7 @@ - + @@ -172,12 +172,33 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index cec79796..cd3f5b8d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,5 +4,7 @@ - + + + \ No newline at end of file diff --git a/30_sources/CHANGES.md b/30_sources/CHANGES.md index 68086efb..70a7922b 100644 --- a/30_sources/CHANGES.md +++ b/30_sources/CHANGES.md @@ -1,5 +1,25 @@ +# v 1.8 +## fix + +* print preview no longer clears unsave indicator #176 +* update to abc2svg 1.14 + * crash when bad value in transpose + * bad pitches after ties and repeat + * the accidentals must be reset on a measure bar +* improved fermata symbol in pdf #178 +* crash when config references a non existing voice #179 +* improved localization #182 + +## enhancement + +* now have menu to import from local disc #177 +* support for 25 string bass harp #180 +* strip =duration on meter "M:3/4 4/4 =3/4" #181 +* initial support to work with file templates #71 +* No initial render after a crash in previous session #103 + # v 1.7.1 ## fix @@ -8,6 +28,7 @@ * turnoff flowconf edit for pdf. This avoids noise around very short vertical flowlines #167 * print preview no longer clears unsaved indicator #176 + # v 1.7 ## fix diff --git a/30_sources/SRC_Zupfnoter/index_opal.html.erb b/30_sources/SRC_Zupfnoter/index_opal.html.erb index e3dec58e..8eaebd94 100644 --- a/30_sources/SRC_Zupfnoter/index_opal.html.erb +++ b/30_sources/SRC_Zupfnoter/index_opal.html.erb @@ -59,6 +59,7 @@
+ <%= begin result = javascript_include_analytics() @@ -68,6 +69,5 @@ result %> - diff --git a/30_sources/SRC_Zupfnoter/public/UD_Zupfnoter-Handbuch-de_review.pdf b/30_sources/SRC_Zupfnoter/public/UD_Zupfnoter-Handbuch-de_review.pdf index fa852b8b..69da7acc 100644 Binary files a/30_sources/SRC_Zupfnoter/public/UD_Zupfnoter-Handbuch-de_review.pdf and b/30_sources/SRC_Zupfnoter/public/UD_Zupfnoter-Handbuch-de_review.pdf differ diff --git a/30_sources/SRC_Zupfnoter/public/index.css b/30_sources/SRC_Zupfnoter/public/index.css index cd0cd897..5f71fe98 100644 --- a/30_sources/SRC_Zupfnoter/public/index.css +++ b/30_sources/SRC_Zupfnoter/public/index.css @@ -221,6 +221,9 @@ rect.highlight { .w2ui-button .active { background-color: #ffedf2; } +.znconfig-button { + padding: 1px; } + #statusbar-layout .w2ui-tb-caption { vertical-align: top; } diff --git a/30_sources/SRC_Zupfnoter/public/index.scss b/30_sources/SRC_Zupfnoter/public/index.scss index d55ec522..83ee7851 100644 --- a/30_sources/SRC_Zupfnoter/public/index.scss +++ b/30_sources/SRC_Zupfnoter/public/index.scss @@ -313,6 +313,10 @@ rect.highlight { background-color: #ffedf2; } +.znconfig-button{ + padding: 1px; +} + #statusbar-layout .w2ui-tb-caption { vertical-align: top; } diff --git a/30_sources/SRC_Zupfnoter/public/locale/de-de.json b/30_sources/SRC_Zupfnoter/public/locale/de-de.json index 3a708046..d4fd76cb 100644 --- a/30_sources/SRC_Zupfnoter/public/locale/de-de.json +++ b/30_sources/SRC_Zupfnoter/public/locale/de-de.json @@ -115,6 +115,7 @@ "18-strings-b-e": "18 Saiten b-e", "2": "2", "21-strings-a-f": "21 Saiten a-f", + "25-strings-G-g Bass": "25 Saiten G-g Bass", "25-strings-g-g": "25 Saiten g-g", "3": "3", "37-strings-g-g": "37 Saiten g-g", @@ -179,8 +180,8 @@ "configure your sheet": "Blatt konfigureren", "could not find extract with number": "Es gibt keinen Auszug mit nummer", "could not open file": "konnte Datei nicht öffnen", - "countnotes": "Zählmarken", "countnote": "Zählmarke", + "countnotes": "Zählmarken", "cp1": "cp1", "cp2": "cp2", "Create new sheet": "Neues Blatt erstellen", @@ -255,6 +256,8 @@ "Extract": "Auszug", "extract": "Auszug", "Extract-Annotation": "Auszugsbeschriftung", + "File": "Datei", + "filebase": "Dateibasis", "Filename not specified in song add an F: instruction": "Kein Filename angegeben. Bitte füge eine F: - Kopfzeile hinzu", "filenamepart": "Filename-Zusatz", "Files saved to dropbox": "Dateien in Dropbox gespeichert", @@ -269,6 +272,7 @@ "font_size": "Schriftgröße", "font_style": "Schriftstil", "FONT_STYLE_DEF": "Schriftstildefinition", + "Free software to create sheets for table harps": "Freies Programm zur Erstellung von Unterlegnoten für Tischharfen", "Get help": "Hilfe anzeigen", "global settings": "Globale Einstellungen", "Goto": "Sprung", @@ -280,6 +284,8 @@ "horizontal position": "horizontale Position (von links nach rechts)", "hpos": "horiz. Position", "Id": "Identifikationsnummer", + "import abc, xml from local system": "abc oder xml Datei importieren", + "Import": "Import", "in distance": "Abstand der Eingangslinie", "inject the default configuration (for development use only)": "inject the default configuration (for development use only)", "insert a title for the \ncurrent extract": "Titel für den aktuellen\n Auszug einfügen", @@ -288,6 +294,7 @@ "instrument specific": "Intrumentspezifika", "instrument": "Instrument", "Interact with dropbox": "Arbeiten mit Dropbox", + "interact with local files": "Arbeit mit lokalen Dateien", "italic": "kursiv", "jumpline_anchor": "Sprungl.Anker", "jumplineoffset": "Sprungl.Anker", @@ -298,6 +305,7 @@ "label": "**--label", "large view\nto see all details": "große Darstellung\nzur Beurteilung\nvon Details", "large": "groß", + "last session failed. Did not render. Cleanup ABC, then render manually": "Fehler in letzter Sitzung. Bereinige ABC und drücke [rendern]", "layout": "Layout", "layout_compact": "Kompaktes Layout", "layout_large": "Großes Layout", @@ -470,6 +478,7 @@ "T05_printed_extracts": "T05 verfügbare Auszüge", "T99_do_not_copy": "T99 bitte nicht kopieren", "target to jump to": "Sprungziel", + "template": "Dateivorlate", "templates": "Vorlagen", "tempo change not suported by zupfnoter": "Zupfnoter unterstüzt keine Tempoänderungen", "Text of annotation": "Text der Notenbeschriftung", @@ -515,6 +524,7 @@ "Zupfnoter": "Zupfnoter", "_ende_der_liste": "", "+: lyric without music": "+: Liedtext ohne Musik", + "+: symbol line without music": "+: symbol line without music", "+: without previous info field": "+: ohne vorhergehends Info-Feld", "'{' in grace note": "'{' in Verzierungsnote", "'}', ')' or ']' missing in %%staves": "'}', ')' oder ']' fehlt in %%staves", @@ -547,8 +557,6 @@ "Bad %%stafflines value": "fehlerhafter Wert für %%stafflines", "Bad %%staffscale value": "fehlerhafter Wert für %%staffscale", "Bad char '$1' in M:": "fehlerhaftes Zeichen '$1' in M:", - "Bad character '}'": "fehlerhaftes Zeichen '}'", - "Bad character ')'": "fehlerhaftes Zeichen ')'", "Bad character '$1'": "fehlerhaftes Zeichen '$1'", "Bad duration '$1' in M:": "fehlerhafte Dauer '$1' in M:", "Bad integer value": "fehlerhafte Ganzzahl", @@ -569,6 +577,7 @@ "Cannot have !$1! on a head": "!$1! kann nicht im Kopfbereich stehen", "Cannot have %%fullsvg inside a tune": "'%%fullsvg' kann nicht innerhalb einer Stimme stehen", "Cannot have a bar in grace notes": "Taktstrich in Vorschlagnote nicht erlaubIl ne peut pas y avoir de barre dans les notes d'agrément", + "Cannot have V:* in tune body": "Cannot have V:* in tune body", "Cannot read file '$1'": "File '$1' kann nicht gelesen werden", "Decoration ignored": "Dekoration ignoriert", "Empty line in tune header - ignored": "Leerzeile in Kopfbereich - ignoriert", @@ -606,12 +615,15 @@ "Not a note in grace note sequence": "Keine Note in Sequenz von Vorschlagnoten", "Not an ASCII character": "kein ASCII - Zeichen", "Not enough measure bars for lyric line": "nicht genug Takte für Liedtextzeile", + "Not enough measure bars for symbol line": "Not enough measure bars for symbol line", "Not enough measures for %%repeat": "nicht genug Takte für %%repeat", "Not enough parameters in %%map": "nicht genug Parameter in %%map", "Not enough symbols after repeat sequence": "nicht genug Symbole nach einer Wiederholungssequenz", "Not enough notes/rests for %%repeat": "nicht genug Noten/Pausen für %%repeat", "Note too long": "Note zu lang", "Note too short": "Note zu kurz", + "s: without music": "s: without music", + "Too many elements in symbol line": "Too many elements in symbol line", "Too many include levels": "Verschachtelung für include zu tiefr", "Too many ties": "zu viele Haltebogen", "Too many words in lyric line": "zu viele Worte in Liedtextzeile", diff --git a/30_sources/SRC_Zupfnoter/src/Rakefile b/30_sources/SRC_Zupfnoter/src/Rakefile index 01a3fc18..455d642a 100644 --- a/30_sources/SRC_Zupfnoter/src/Rakefile +++ b/30_sources/SRC_Zupfnoter/src/Rakefile @@ -59,6 +59,14 @@ task :updateAbc2svgDev do sources.each {|f| sh " rm #{f} ; NOMIN=1 ./ninja #{f}"} end + ["de", "en"].each do |lang| + File.open(%Q{localization/abc2svg_#{lang}-#{lang}.json}, "w") do |f| + f.puts ("{") + f.puts File.read(%Q{#{abc2svgrepo}/err-#{lang}.js}).gsub("user.textrans = ", %Q{"phrases":}) + f.puts ("}") + end + end + File.open("#{VENDORFOLDER}/#{abc2svg_file}", "w") do |f| f.puts "// compiled for Zupfnoter #{Time.now}" [sources].flatten.each do |s| @@ -66,6 +74,8 @@ task :updateAbc2svgDev do f.puts File.read("#{abc2svgrepo}/#{s}") end end + + end desc "Build our app to #{ZUPFNOTER_JS}" diff --git a/30_sources/SRC_Zupfnoter/src/abc2svg_to_harpnotes.rb b/30_sources/SRC_Zupfnoter/src/abc2svg_to_harpnotes.rb index 3485d44e..0b6d1a0d 100644 --- a/30_sources/SRC_Zupfnoter/src/abc2svg_to_harpnotes.rb +++ b/30_sources/SRC_Zupfnoter/src/abc2svg_to_harpnotes.rb @@ -48,6 +48,7 @@ def transform(zupfnoter_abc) def _make_harpnote_options result = {lyrics: {text: @info_fields[:W]}} + result[:template] = $conf.get('template') result[:print] = $conf.get("produce").map do |i| title = $conf.get("extract.#{i}.title") if title diff --git a/30_sources/SRC_Zupfnoter/src/config-form.rb b/30_sources/SRC_Zupfnoter/src/config-form.rb index cc78471e..6bfe6648 100644 --- a/30_sources/SRC_Zupfnoter/src/config-form.rb +++ b/30_sources/SRC_Zupfnoter/src/config-form.rb @@ -326,7 +326,7 @@ def initialize FloatPair => ['pos', 'size', 'spos', 'ELLIPSE_SIZE', 'REST_SIZE', "DRAWING_AREA_SIZE", 'cp1', 'cp2', 'a3_offset', 'a4_offset', 'jumpline_anchor'], IntegerList => ['a4_pages', 'voices', 'flowlines', 'subflowlines', 'jumplines', 'layoutlines', 'verses', 'hpos', 'vpos', "produce", "llpos", "trpos"], Integer => ['startpos', 'pack_method', 'p_repeat', 'p_begin', 'p_end', 'p_follow', 'PITCH_OFFSET'], - OneLineString => ['title', 'filenamepart', 'url'], + OneLineString => ['title', 'filenamepart', 'url', 'filebase'], MultiLineString => ['text'], Boolean => ['limit_a3', 'autopos', 'show_border', 'nonflowrest', "show", "fill", "grid"], Float => ['LINE_THIN', 'LINE_MEDIUM', 'LINE_THICK', 'pack_max_spreadfactor', 'pack_min_increment', 'minc_f', "X_SPACING", "X_OFFSET"], diff --git a/30_sources/SRC_Zupfnoter/src/controller.rb b/30_sources/SRC_Zupfnoter/src/controller.rb index 07bee76b..dc47893a 100644 --- a/30_sources/SRC_Zupfnoter/src/controller.rb +++ b/30_sources/SRC_Zupfnoter/src/controller.rb @@ -1,6 +1,24 @@ # This is a wrapper class for local store +class LastRenderMonitor + def ok? + result = %x{localStorage.getItem('lastrender')} + Native(result).nil? + end + + def set_active + %x{localStorage.setItem('lastrender', #{Time.now()}) } + true + end + + def clear + %x{localStorage.removeItem('lastrender') } + false + end +end + + class LocalStore def initialize(name) @@ -44,7 +62,7 @@ def delete(key) if @directory[key] $log.warning("local storage: key '#{key}' does not exist") else - `localStorage.deleteItem(self.$mangle_key(key))` + `localStorage.removeItem(self.$mangle_key(key))` @directory[key] = nil save_dir end @@ -76,9 +94,7 @@ def save_dir class Controller - - attr :editor, :harpnote_preview_printer, :tune_preview_printer, :systemstatus - attr_accessor :zupfnoter_ui, :info_url + attr_accessor :dropped_abc, :dropboxclient, :editor, :harpnote_preview_printer, :info_url, :tune_preview_printer, :systemstatus, :zupfnoter_ui def initialize @@ -90,11 +106,10 @@ def initialize 'en-us' => 'en-US' } browser_language = `navigator.language`.downcase - zupfnoter_language = languages[browser_language] + zupfnoter_language = languages[browser_language] || 'de-de' @info_url = "https://www.zupfnoter.de/category/info_#{zupfnoter_language}" - I18n.locale(zupfnoter_language) if browser_language @version = VERSION @zupfnoter_ui = `window.hugo = new init_w2ui(#{self});` @@ -115,12 +130,15 @@ def initialize $log.info ("Ruby: #{RUBY_VERSION}") $log.info ("Abc2svg: #{%x{abc2svg.version}}") + I18n.locale(zupfnoter_language) if browser_language + + $conf = Confstack.new(nil) $conf.strict = false $conf.push(_init_conf) - $settings = {} # this is te keep runtime settings + $settings = {} # this is te keep runtime settings @json_validator = Ajv::JsonValidator.new @@ -167,9 +185,19 @@ def initialize if @systemstatus[:mode] == :demo handle_command("view 0") + else + @editor.get_lyrics + + #$log.error(I189n.t("last session failed. Did not render")) + lastrender = LastRenderMonitor.new + + if lastrender.ok? + render_previews unless uri[:parsed_search][:debug] # prevernt initial rendition in case of hangs caused by input + else + $log.error(I18n.t("last session failed. Did not render. Cleanup ABC, then render manually")) + call_consumers(:error_alert) + end end - @editor.get_lyrics - render_previews unless uri[:parsed_search][:debug] # prevernt initial rendition in case of hangs caused by input # #setup_nodewebkit # # now trigger the interactive UI @@ -187,6 +215,21 @@ def initialize # end + def about_zupfnoter + %Q{

#{I18n.t("Free software to create sheets for table harps")}

+ + + + + + + + +
Zupfnoter:#{VERSION}
Opal:#{RUBY_ENGINE_VERSION}
Ruby:#{RUBY_VERSION}
abc2svg:#{%x{abc2svg.version}}
xml2abc.js:#{%x{xml2abc_VERSION}}
+

© #{Time.now.year} Bernhard Weichel - info@zupfnoter.de

+

Website: https://www.zupfnoter.de

+ } + end # this method invokes the system conumers def call_consumers(clazz) @@ -203,7 +246,7 @@ def call_consumers(clazz) extracts: [lambda {@extracts.each {|entry| title = "#{entry.first}: #{entry.last}" `set_extract_menu(#{entry.first}, #{title})`} - call_consumers(:systemstatus) # restore systemstatus as set_extract_menu redraws the toolbar + call_consumers(:systemstatus) # restore systemstatus as set_extract_menu redraws the toolbar }] } @systemstatus_consumers[clazz].each {|c| c.call()} @@ -359,7 +402,7 @@ def render_a3(index = @systemstatus[:view]) # turn of flowconf: otherwise very short unconfigured undconfigured flowlines are # longer because of the default values of the handles whihc make the curve from +-+ to -+-+- $settings[:flowconf] = false - result = Harpnotes::PDFEngine.new.draw(layout_harpnotes(index, 'A3')) + result = Harpnotes::PDFEngine.new.draw(layout_harpnotes(index, 'A3')) $settings[:flowconf] = flowconf result end @@ -367,9 +410,9 @@ def render_a3(index = @systemstatus[:view]) # render the harpnotes splitted on a4 pages def render_a4(index = @systemstatus[:view]) - flowconf = $settings[:flowconf] + flowconf = $settings[:flowconf] $settings[:flowconf] = false - result = Harpnotes::PDFEngine.new.draw_in_segments(layout_harpnotes(index, 'A4')) + result = Harpnotes::PDFEngine.new.draw_in_segments(layout_harpnotes(index, 'A4')) $settings[:flowconf] = flowconf result end @@ -497,7 +540,7 @@ def render_tunepreview_callback abc_text = @editor.get_abc_part abc_text = abc_text.split("\n").map {|line| result = line - result = result. gsub(/(\\?)(~)/){|m| m[0]=='\\' ? m[1] : ' '} if line.start_with? 'W:' + result = result.gsub(/(\\?)(~)/) {|m| m[0]=='\\' ? m[1] : ' '} if line.start_with? 'W:' result }.join("\n") @@ -558,6 +601,7 @@ def render_previews() # by calling setup_tune_preview # todo: clarfiy why setup_tune_preview needs to be called on every preview result = Promise.new.tap do |promise| + LastRenderMonitor.new.set_active set_active("#tunePreview") `setTimeout(function(){#{render_tunepreview_callback()};#{promise}.$resolve()}, 0)` end.then do @@ -570,12 +614,12 @@ def render_previews() call_consumers(:error_alert) set_inactive("#harpPreview") @editor.set_annotations($log.annotations) + LastRenderMonitor.new.clear promise.resolve() end end end - result end @@ -610,10 +654,10 @@ def layout_harpnotes(print_variant = 0, page_format='A4') # prepare extract menu printed_extracts = $conf['produce'] - @extracts = $conf.get('extract').inject([]) do |r, entry| + @extracts = $conf.get('extract').inject([]) do |r, entry| extract_number = entry.last.dig(:notes, :T01_number_extract, :text) - print = (printed_extracts.include?(entry.first.to_i) ? '* ' : ' ') - title = %Q{#{print}#{extract_number} #{entry.last[:title]} } + print = (printed_extracts.include?(entry.first.to_i) ? '* ' : ' ') + title = %Q{#{print}#{extract_number} #{entry.last[:title]} } r.push([entry.first, title]) end @@ -816,95 +860,8 @@ def set_harppreview_size(size) @harpnote_preview_printer.set_canvas(size) end - def set_file_drop(dropzone) - %x{ - - function pasteXml(text){ - try{ - var xmldata = $.parseXML(text); - } - catch(ex){ - #{$log.error(`ex.message`)} - } - - var options = { - 'u': 0, 'b': 0, 'n': 0, // unfold repeats (1), bars per line, chars per line - 'c': 0, 'v': 0, 'd': 0, // credit text filter level (0-6), no volta on higher voice numbers (1), denominator unit length (L:) - 'm': 0, 'x': 0, // with midi volume and panning (1), no line breaks (1) - 'p': 'f' - }; // page format: scale (1.0), width, left- and right margin in cm - - result = vertaal(xmldata, options); - #{ - $log.info(`result[1]`) - @dropped_abc = `result[0]` - handle_command('drop') - } - } - - function pasteMxl(text){ - zip = new JSZip(text); - text = zip.file(/^[^/ ]*\.xml$/)[0].asText(); - pasteXml(text); - } - - function pasteAbc(text){ - #{ - @dropped_abc=`text` - handle_command('drop') - } - } - - - function initializeAbc2svg(element) { - - //xml2abc = new ZnXml2Abc(); - - function handleDrop(event) { - event.stopPropagation(); - event.preventDefault(); - files = event.dataTransfer.files; - reader = new FileReader(); - - reader.onload = function (e) { - text = e.target.result; - if (text[0] == '<'){ - pasteXml(text); - } - else if (files[0].name.endsWith(".mxl")) { - pasteMxl(text) - } - else - { - pasteAbc(text); - } - } - if (files[0].name.endsWith('.mxl')){ - reader.readAsBinaryString(files[0]); - } - else - { - reader.readAsText(files[0], "UTF-8"); - } - - } - - function handleDragover(event) { - event.stopPropagation(); - event.preventDefault(); - event.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy. - } - - a = document.getElementById(element); - a.addEventListener('dragover', handleDragover, false); - a.addEventListener('drop', handleDrop); - } - - initializeAbc2svg(#{dropzone}); - } - - end - + # note the filedrop is not entirely initialized in user-interface.js + # def toggle_console %x{ @@ -917,7 +874,7 @@ def toggle_console def setup_ui_listener # activate drop of files - set_file_drop('layout'); + # set_file_drop('layout'); this is now in userinterface.js # changes in the editor @editor.on_change do |e| @@ -967,12 +924,10 @@ def setup_ui_listener end @harpnote_player.on_noteon do |e| - $log.debug("noteon #{Native(e)[:startChar]} (#{__FILE__} #{__LINE__})") highlight_abc_object(e) end @harpnote_player.on_noteoff do |e| - $log.debug("noteoff #{Native(e)[:startChar]} (#{__FILE__} #{__LINE__})") unhighlight_abc_object(e) end diff --git a/30_sources/SRC_Zupfnoter/src/controller_command_definitions.rb b/30_sources/SRC_Zupfnoter/src/controller_command_definitions.rb index 43942543..269e7761 100644 --- a/30_sources/SRC_Zupfnoter/src/controller_command_definitions.rb +++ b/30_sources/SRC_Zupfnoter/src/controller_command_definitions.rb @@ -318,7 +318,7 @@ def __ic_03_create_commands command.undoable = false command.set_help {"set the current editor content as template"} command.as_action do |args| - template = @editor.get_text('extract.0') + template = @editor.get_text() if template.empty? `localStorage.removeItem(#{ZN_TEMPLATENAME})` else @@ -328,6 +328,24 @@ def __ic_03_create_commands end end + @commands.add_command(:edittemplate) do |command| + command.undoable = true + command.set_help {"load the current template to the editor"} + command.as_action do |args| + args[:oldval] = @editor.get_text() + template = get_current_template + @editor.set_text(template) + nil + end + + command.as_inverse do |args| + @editor.set_text(args[:oldval]) + end + + end + + + @commands.add_command(:setsetting) do |command| command.undoable = false @@ -418,7 +436,7 @@ def __ic_03_create_commands entry = $conf["presets.notes.#{key}"] to_key = entry[:key] || key value = entry[:value] - all_value[to_key] = entry[:value] + all_value[to_key] = entry[:value] values["preset.notes.#{key}"] = lambda {{key: "extract.#{@systemstatus[:view]}.notes.#{to_key}", value: value, method: :patch}} end @@ -518,6 +536,7 @@ def expand_extractnumbering(keys) _get_quicksetting_commands('instrument') }, stringnames: {keys: expand_extract_keys([:stringnames, :sortmark])}, + template: {keys: ['template.filebase', 'template.title']}, extract0: {keys: ['extract.0']}, extract_current: {keys: expand_extract_keys($conf.keys.select {|k| k.start_with?('extract.0.')}.map {|k| k.split('extract.0.').last})}, errors: {keys: @validation_errors}, @@ -679,11 +698,11 @@ def expand_extractnumbering(keys) end - def create_from_current_template(parameters) + + def get_current_template result = Native(`localStorage.getItem(#{ZN_TEMPLATENAME})`) unless `result` - result = %Q{ -X:{{song_id}} + result = %Q{X:{{song_id}} F:{{song_id}}_{{filename}} T:{{song_title}} C: @@ -733,6 +752,12 @@ def create_from_current_template(parameters) "text" : "© 2017 Notenbild: ", "style" : "small" }, + "T04_to_order" : { + "pos" : [340, 242], + "text" : "zu beziehen bei\n", + "style" : "small" + }, + "T05_printed_extracts" : {"pos": [393, 22], "text": "-A -B", "style": "smaller"}, "T99_do_not_copy" : { "pos" : [380, 284], "text" : "Bitte nicht kopieren", @@ -752,11 +777,19 @@ def create_from_current_template(parameters) "3" : {"notes": {"T01_number_extract": {"text": "-M"}}} }, "$schema" : "https://zupfnoter.weichel21.de/schema/zupfnoter-config_1.0.json", - "$version" : "{{version}}" + "$version" : "{{version}}", + "template" : {"title": "Zupfnoter-default"} } } end + result + end + + def create_from_current_template(parameters) + + result = get_current_template + parameters.each do |name, value| result = result.gsub("{{#{name}}}", value) end @@ -1085,7 +1118,6 @@ def __ic_05_dropbox_commands end end - @commands.add_command(:dsave) do |command| command.add_parameter(:path, :string) do |parameter| parameter.set_default {@dropboxpath} @@ -1104,8 +1136,17 @@ def __ic_05_dropbox_commands end layout_harpnotes # todo: this uses a side-effect to get the @music_model populated - print_variants = @music_model.harpnote_options[:print] - filebase = @music_model.meta_data[:filename] + + if @music_model.meta_data[:filename].include?('{{') + is_template = true + filebase = @music_model.harpnote_options.dig(:template, :filebase) + unless filebase + raise "no filebase given for template" + end + else + print_variants = @music_model.harpnote_options[:print] + filebase = @music_model.meta_data[:filename] + end rootpath = args[:path] call_consumers(:disable_save) @@ -1113,17 +1154,19 @@ def __ic_05_dropbox_commands save_promises=[] @dropboxclient.authenticate().then do save_promises = [@dropboxclient.write_file("#{rootpath}#{filebase}.abc", @editor.get_text)] - save_promises.push @dropboxclient.write_file("#{rootpath}#{filebase}.html", @tune_preview_printer.get_html) - pdfs = {} - print_variants.map do |print_variant| - index = print_variant[:view_id] - pdfs["#{rootpath}#{filebase}_#{print_variant[:filenamepart]}_a3.pdf"] = render_a3(index).output(:blob) - pdfs["#{rootpath}#{filebase}_#{print_variant[:filenamepart]}_a4.pdf"] = render_a4(index).output(:blob) - nil - end + unless is_template + save_promises.push @dropboxclient.write_file("#{rootpath}#{filebase}.html", @tune_preview_printer.get_html) + pdfs = {} + print_variants.map do |print_variant| + index = print_variant[:view_id] + pdfs["#{rootpath}#{filebase}_#{print_variant[:filenamepart]}_a3.pdf"] = render_a3(index).output(:blob) + pdfs["#{rootpath}#{filebase}_#{print_variant[:filenamepart]}_a4.pdf"] = render_a4(index).output(:blob) + nil + end - pdfs.each do |name, pdfdata| - save_promises.push(@dropboxclient.write_file(name, pdfdata)) + pdfs.each do |name, pdfdata| + save_promises.push(@dropboxclient.write_file(name, pdfdata)) + end end end.fail do |err| _report_error_from_promise(err) @@ -1145,7 +1188,6 @@ def __ic_05_dropbox_commands end end - # todo this is obsolete ... use dopen_fn istead @commands.add_command(:dopen) do |command| diff --git a/30_sources/SRC_Zupfnoter/src/harpnote_player.rb b/30_sources/SRC_Zupfnoter/src/harpnote_player.rb index ae06a6ed..23dd2ba5 100644 --- a/30_sources/SRC_Zupfnoter/src/harpnote_player.rb +++ b/30_sources/SRC_Zupfnoter/src/harpnote_player.rb @@ -23,7 +23,7 @@ def is_playing? # This creates an instrument upon request def create_inst(instrument_id) unless @inst[instrument_id] - $log.debug "creating instrument #{instrument_id} " + # $log.debug "creating instrument #{instrument_id} " @inst[instrument_id] = %x{new Instrument("piano")} Native(@inst[instrument_id]).on(:noteon) do |element| abc_element = Native(element)[:origin] diff --git a/30_sources/SRC_Zupfnoter/src/harpnotes.rb b/30_sources/SRC_Zupfnoter/src/harpnotes.rb index eb68b237..90ac2450 100644 --- a/30_sources/SRC_Zupfnoter/src/harpnotes.rb +++ b/30_sources/SRC_Zupfnoter/src/harpnotes.rb @@ -982,7 +982,7 @@ class Glyph < Symbol ["c", -0.09, -0.12, -0.09, -0.18, 0.03, -0.69], ["c", 0.33, -1.62, 0.78, -3, 1.47, -4.38], ["c", 1.77, -3.54, 4.44, -5.67, 7.56, -5.97], ["z"], - ["M", -0.5, 1.5], # don't know what I am doing, but "m" is not properly supported by opal-jspdf. So I do an sbsolute move + ["M", -0.5, 1.5], # don't know what I am doing, but "m" is not properly supported by opal-jspdf. So I do an sbsolute move ["c", 1.38, -0.3, 2.58, 0.9, 2.31, 2.25], ["c", -0.15, 0.72, -0.78, 1.35, -1.47, 1.5], ["c", -1.38, 0.27, -2.58, -0.93, -2.31, -2.31], @@ -1292,7 +1292,7 @@ def layout(music, beat_layout = nil, print_variant_nr = 0, page_format='A4') layoutlines = print_options_hash[:voices] + print_options_hash[:layoutlines].uniq beat_compression_map = compute_beat_compression(music, layoutlines) end - maximal_beat = beat_compression_map.values.max + maximal_beat = beat_compression_map.values.max || 0 full_beat_spacing = ($conf.get('layout.DRAWING_AREA_SIZE').last - @y_offset) / maximal_beat if full_beat_spacing < @beat_spacing @@ -1384,6 +1384,7 @@ def layout(music, beat_layout = nil, print_variant_nr = 0, page_format='A4') title = music.meta_data[:title] || "untitled" filename = music.meta_data[:filename] meter = music.meta_data[:meter] + meter = meter.last.split("=").first if meter key = music.meta_data[:key] composer = music.meta_data[:composer] tempo = music.meta_data[:tempo_display] diff --git a/30_sources/SRC_Zupfnoter/src/i18n.rb b/30_sources/SRC_Zupfnoter/src/i18n.rb index 2b7cca08..13fc6566 100644 --- a/30_sources/SRC_Zupfnoter/src/i18n.rb +++ b/30_sources/SRC_Zupfnoter/src/i18n.rb @@ -43,7 +43,11 @@ def self.locale(language) $conf_helptext = Native(response.body) $conf_helptext = JSON.parse($conf_helptext) if $conf_helptext.is_a? String end.fail do |response| - alert "could not loaad confhelp #{response}" + $log.error %Q{BUG: no language support for } + %Q{ "#{language}": #{response.body}"} + HTTP.get("public/locale/conf-help_de-de.json?#{Time.now.to_i}").then do |response| + $conf_helptext = Native(response.body) + $conf_helptext = JSON.parse($conf_helptext) if $conf_helptext.is_a? String + end end.always do |response| end diff --git a/30_sources/SRC_Zupfnoter/src/init_conf.rb b/30_sources/SRC_Zupfnoter/src/init_conf.rb index a75ad81e..228edf40 100644 --- a/30_sources/SRC_Zupfnoter/src/init_conf.rb +++ b/30_sources/SRC_Zupfnoter/src/init_conf.rb @@ -42,6 +42,7 @@ def self.init_conf() {produce: [0], abc_parser: 'ABC2SVG', restposition: {default: :center, repeatstart: :next, repeatend: :default}, + template: {filebase: "-no-template-", title: "- no template -"}, wrap: 60, @@ -138,7 +139,7 @@ def self.init_conf() X_OFFSET: lambda {$conf['extract.0.layout.X_OFFSET']} # just to be safe }, stringnames: {text: lambda {$conf['extract.0.stringnames.text']}, - marks: {hpos: lambda {$conf['extract.0.stringnames.marks.hpos']}} + marks: {hpos: [43,79]} }, printer: {a4_pages: [0, 1, 2], a4_offset: lambda {$conf['extract.0.printer.a4_offset']}, @@ -153,7 +154,22 @@ def self.init_conf() X_OFFSET: lambda {$conf['extract.0.layout.X_OFFSET']} # just to be safe }, stringnames: {text: lambda {self.cut_string_names($conf['extract.0.stringnames.text'], 12, 36)}, - marks: {hpos: lambda {$conf['extract.0.stringnames.marks.hpos']} + marks: {hpos: [55,79] + } + }, + printer: {a4_pages: [1, 2], + a3_offset: [-5, 0], + a4_offset: lambda {$conf['extract.0.printer.a4_offset']}} + }, + '25-strings-G-g Bass' => { + layout: {instrument: '25-strings-g-g', + limit_a3: false, + PITCH_OFFSET: lambda {-31}, + X_SPACING: lambda {$conf['extract.0.layout.X_SPACING']}, + X_OFFSET: lambda {$conf['extract.0.layout.X_OFFSET']} # just to be safe + }, + stringnames: {text: lambda {self.cut_string_names($conf['extract.0.stringnames.text'], 12, 36)}, + marks: {hpos: [43,67] } }, printer: {a4_pages: [1, 2], diff --git a/30_sources/SRC_Zupfnoter/src/localization/abc2svg_de-de.json b/30_sources/SRC_Zupfnoter/src/localization/abc2svg_de-de.json index d76d3eaf..ca01f4b9 100644 --- a/30_sources/SRC_Zupfnoter/src/localization/abc2svg_de-de.json +++ b/30_sources/SRC_Zupfnoter/src/localization/abc2svg_de-de.json @@ -1,22 +1,25 @@ { - "phrases": { - // these are the messages for abc2svg +//JS abc2svg - German translation of the error codes: +// Deutsche Übersetzung der Fehlercodes +// Bernhard Weichel +// Terminologie +// +// Tune - Stimme +// Staff - Notensystem +// head - Kopfbereich +// grace note "vorschlagnote" +// - // - // Tune - Stimme - // Staff - Notensystem - // head - Kopfbereich - // grace note "vorschlagnote" | ziernote - // - // %% äquiivalent von %% und I: +"phrases":{ "+: lyric without music": "+: Liedtext ohne Musik", + "+: symbol line without music": "+: symbol line without music", "+: without previous info field": "+: ohne vorhergehends Info-Feld", "'{' in grace note": "'{' in Verzierungsnote", "'}', ')' or ']' missing in %%staves": "'}', ')' oder ']' fehlt in %%staves", "',' lacking in annotation '@x,y'": "',' fehlt in Beschriftung '@x,y'", - "'$1' is not a note": "'$1' is keine Note", + "'$1' is not a note": "'$1' is keine Note", "'$1:' line ignored": "'$1:' Zeile ignoreirt", "$1: inside tune - ignored": "$1: innerhalb der Stimme ignoriert", "!$1! must be on a note": "!$1! muss an einer Note stehen", @@ -44,16 +47,14 @@ "Bad %%stafflines value": "fehlerhafter Wert für %%stafflines", "Bad %%staffscale value": "fehlerhafter Wert für %%staffscale", "Bad char '$1' in M:": "fehlerhaftes Zeichen '$1' in M:", - "Bad character '}'": "fehlerhaftes Zeichen '}'", - "Bad character ')'": "fehlerhaftes Zeichen ')'", "Bad character '$1'": "fehlerhaftes Zeichen '$1'", "Bad duration '$1' in M:": "fehlerhafte Dauer '$1' in M:", "Bad integer value": "fehlerhafte Ganzzahl", - "Bad instr= value": "fehlerhafter Wert für instr=", + "Bad instr= value": "fehlerhafter Wert für instr=", "Bad L: value": "Fehlerhafter Wert für L:", "Bad note in %%map": "fehlerhafte Note in %%map", "Bad page width": "fehlerhafte Seitenbreite", - "Bad program in %%MIDI": "falsches Program in %%MIDI", + "Bad program in %%MIDI": "falsches Program in %%MIDI", "Bad scale value in %%font": "fehlerhafter scale - Wert in %%font", "Bad stafflines= value": "fehlerhafter Wert für stafflines=", "Bad tie": "fehlerhafter Haltebogen", @@ -66,6 +67,7 @@ "Cannot have !$1! on a head": "!$1! kann nicht im Kopfbereich stehen", "Cannot have %%fullsvg inside a tune": "'%%fullsvg' kann nicht innerhalb einer Stimme stehen", "Cannot have a bar in grace notes": "Taktstrich in Vorschlagnote nicht erlaubIl ne peut pas y avoir de barre dans les notes d'agrément", + "Cannot have V:* in tune body": "Cannot have V:* in tune body", "Cannot read file '$1'": "File '$1' kann nicht gelesen werden", "Decoration ignored": "Dekoration ignoriert", "Empty line in tune header - ignored": "Leerzeile in Kopfbereich - ignoriert", @@ -83,8 +85,8 @@ "Line underfull ($1pt of $2pt)": "Zeile nicht voll genug ($1pt of $2pt)", "Misplaced '$1' in %%staves": "'$1' fehlerhaft platziert in %%staves", "Misplaced dot": "fehlerhaft platzierter Punkt", - "Mix of old and new transposition syntaxes": - "Mix von alter und neuer Transponierungs-syntax", + "Mix of old and new transposition syntaxes": + "Mix von alter und neuer Transponierungs-syntax", "No $1 after %%$2": "kein $1 nach %%$2", "No in %%beginsvg sequence": "kein in %%beginsvg squenz", "No in %%beginsvg sequence": "kein in %%beginsvg sequenz", @@ -95,7 +97,7 @@ "No end of repeat string": "kein Ende des Wiederholungszeichens", "No end of tuplet": "kein Ende des Tuplets", "No end of tuplet in this music line": - "Kein ende des Tuplets in dieser Zeile", + "Kein ende des Tuplets in dieser Zeile", "No function for decoration '$1'": "keine Funktion für Dekoration '$1'", "No note before '-'": "keine Note vor '-'", "No note before '<'": "keine Note vor '<'", @@ -105,12 +107,16 @@ "Not a note in grace note sequence": "Keine Note in Sequenz von Vorschlagnoten", "Not an ASCII character": "kein ASCII - Zeichen", "Not enough measure bars for lyric line": "nicht genug Takte für Liedtextzeile", + "Not enough measure bars for symbol line": + "Not enough measure bars for symbol line", "Not enough measures for %%repeat": "nicht genug Takte für %%repeat", "Not enough parameters in %%map": "nicht genug Parameter in %%map", "Not enough symbols after repeat sequence": "nicht genug Symbole nach einer Wiederholungssequenz", "Not enough notes/rests for %%repeat": "nicht genug Noten/Pausen für %%repeat", "Note too long": "Note zu lang", "Note too short": "Note zu kurz", + "s: without music": "s: without music", + "Too many elements in symbol line": "Too many elements in symbol line", "Too many include levels": "Verschachtelung für include zu tiefr", "Too many ties": "zu viele Haltebogen", "Too many words in lyric line": "zu viele Worte in Liedtextzeile", @@ -125,6 +131,5 @@ "Voice overlay already started": "Stimmüberlagerung bereits gestartet", "w: without music": "w: ohne noten", "Wrong duration in voice overlay": "fehlerhafte Notenwerte in Stimmüberlagerung" - } } - +} diff --git a/30_sources/SRC_Zupfnoter/src/localization/zupfnoter_de-de.json b/30_sources/SRC_Zupfnoter/src/localization/zupfnoter_de-de.json index 913d7034..29527011 100644 --- a/30_sources/SRC_Zupfnoter/src/localization/zupfnoter_de-de.json +++ b/30_sources/SRC_Zupfnoter/src/localization/zupfnoter_de-de.json @@ -8,6 +8,7 @@ "18-strings-b-e": "18 Saiten b-e", "2": "2", "21-strings-a-f": "21 Saiten a-f", + "25-strings-G-g Bass": "25 Saiten G-g Bass", "25-strings-g-g": "25 Saiten g-g", "3": "3", "37-strings-g-g": "37 Saiten g-g", @@ -72,8 +73,8 @@ "configure your sheet": "Blatt konfigureren", "could not find extract with number": "Es gibt keinen Auszug mit nummer", "could not open file": "konnte Datei nicht öffnen", - "countnotes": "Zählmarken", "countnote": "Zählmarke", + "countnotes": "Zählmarken", "cp1": "cp1", "cp2": "cp2", "Create new sheet": "Neues Blatt erstellen", @@ -148,6 +149,8 @@ "Extract": "Auszug", "extract": "Auszug", "Extract-Annotation": "Auszugsbeschriftung", + "File": "Datei", + "filebase": "Dateibasis", "Filename not specified in song add an F: instruction": "Kein Filename angegeben. Bitte füge eine F: - Kopfzeile hinzu", "filenamepart": "Filename-Zusatz", "Files saved to dropbox": "Dateien in Dropbox gespeichert", @@ -162,6 +165,7 @@ "font_size": "Schriftgröße", "font_style": "Schriftstil", "FONT_STYLE_DEF": "Schriftstildefinition", + "Free software to create sheets for table harps": "Freies Programm zur Erstellung von Unterlegnoten für Tischharfen", "Get help": "Hilfe anzeigen", "global settings": "Globale Einstellungen", "Goto": "Sprung", @@ -173,6 +177,8 @@ "horizontal position": "horizontale Position (von links nach rechts)", "hpos": "horiz. Position", "Id": "Identifikationsnummer", + "import abc, xml from local system": "abc oder xml Datei importieren", + "Import": "Import", "in distance": "Abstand der Eingangslinie", "inject the default configuration (for development use only)": "inject the default configuration (for development use only)", "insert a title for the \ncurrent extract": "Titel für den aktuellen\n Auszug einfügen", @@ -181,6 +187,7 @@ "instrument specific": "Intrumentspezifika", "instrument": "Instrument", "Interact with dropbox": "Arbeiten mit Dropbox", + "interact with local files": "Arbeit mit lokalen Dateien", "italic": "kursiv", "jumpline_anchor": "Sprungl.Anker", "jumplineoffset": "Sprungl.Anker", @@ -191,6 +198,7 @@ "label": "**--label", "large view\nto see all details": "große Darstellung\nzur Beurteilung\nvon Details", "large": "groß", + "last session failed. Did not render. Cleanup ABC, then render manually": "Fehler in letzter Sitzung. Bereinige ABC und drücke [rendern]", "layout": "Layout", "layout_compact": "Kompaktes Layout", "layout_large": "Großes Layout", @@ -365,6 +373,7 @@ "T05_printed_extracts": "T05 verfügbare Auszüge", "T99_do_not_copy": "T99 bitte nicht kopieren", "target to jump to": "Sprungziel", + "template": "Dateivorlate", "templates": "Vorlagen", "tempo change not suported by zupfnoter": "Zupfnoter unterstüzt keine Tempoänderungen", "Text of annotation": "Text der Notenbeschriftung", @@ -411,6 +420,8 @@ "Zupfnoter": "Zupfnoter", + + "_ende_der_liste": "" } } diff --git a/30_sources/SRC_Zupfnoter/src/opal-ajv.rb b/30_sources/SRC_Zupfnoter/src/opal-ajv.rb index e2a79b83..b74f02a5 100644 --- a/30_sources/SRC_Zupfnoter/src/opal-ajv.rb +++ b/30_sources/SRC_Zupfnoter/src/opal-ajv.rb @@ -144,11 +144,18 @@ def _schema :minItems => 1, :uniqueItems => true, :items => {:type => "integer"}}, - :abc_parser => {:type => "string"}, - :restposition => {:type => "object", + :template => {:type => "object", :additionalProperties => false, - :required => ["default", "repeatstart", "repeatend"], :properties => + { + :filebase => {:type => "string"}, + :title => {:type => "string"} + }}, + :abc_parser => {:type => "string"}, + :restposition => {:type => "object", + :additionalProperties => false, + :required => ["default", "repeatstart", "repeatend"], + :properties => {:default => {:type => "string"}, :repeatstart => {:type => "string"}, :repeatend => {:type => "string"}}}, @@ -180,446 +187,446 @@ def _schema } }, # eend of defaults - :templates => {:type => "object", - :required => ["notes", "lyrics", "tuplet", "annotations"], - :properties => - {:notes => {:"$ref" => '#/definitions/notes_entry'}, - :lyrics => {:type => "object", - :required => ["verses", "pos"], - :properties => - {:verses => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}, - :pos => {:'$ref' => '#/definitions/pos'}}}, - :tuplet => {:type => "object", - :required => ["cp1", "cp2", "shape"], - :properties => - {:cp1 => {:'$ref' => '#/definitions/pos'}, - :cp2 => {:'$ref' => '#/definitions/pos'}, - :shape => {:type => "array", + :templates => {:type => "object", + :required => ["notes", "lyrics", "tuplet", "annotations"], + :properties => + {:notes => {:"$ref" => '#/definitions/notes_entry'}, + :lyrics => {:type => "object", + :required => ["verses", "pos"], + :properties => + {:verses => {:type => "array", :minItems => 1, :uniqueItems => true, - :items => {:type => "string"}}}}, - :annotations => {:type => "object", - :required => ["text", "pos"], - :properties => - {:text => {:type => "string"}, - :pos => {:'$ref' => '#/definitions/pos'}}}}}, - :annotations => {:type => "object", - :required => ["vl", "vt", "vr"], - :properties => - {:vl => {:type => "object", - :required => ["text", "pos"], - :properties => - {:text => {:type => "string"}, - :pos => {:'$ref' => '#/definitions/pos'}}}, - :vt => {:type => "object", - :required => ["text", "pos"], - :properties => - {:text => {:type => "string"}, - :pos => {:'$ref' => '#/definitions/pos'}}}, - :vr => {:type => "object", - :required => ["text", "pos"], - :properties => - {:text => {:type => "string"}, - :pos => {:'$ref' => '#/definitions/pos'}}}}}, - :extract => {:type => "object", - #:required => ["0", "1", "2", "3"], - :patternProperties => - {:"\d*" => {:type => "object", - :additionalProperties => false, - :requiredx => - ["title", "filenamepart", "startpos", "voices", "synchlines", - "flowlines", "subflowlines", "jumplines", "repeatsigns", "layoutlines", - "legend", "lyrics", "layout", "nonflowrest", "notes", "barnumbers", - "countnotes", "stringnames", "printer"], - :properties => - {:title => {:type => "string"}, - :filenamepart => {}, - :startpos => {:type => "integer"}, - :voices => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}, - :synchlines => {:type => "array", - :minItems => 0, - :uniqueItems => true, - :items => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}}, - :flowlines => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}, - :subflowlines => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}, - :jumplines => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}, - :repeatsigns => {:type => "object", - :requiredx => ["voices", "left", "right"], - :properties => - {:voices => {:type => "array", - :minItems => 0, - :uniqueItems => true, - :items => {}}, - :left => {:type => "object", - :required => ["pos", "text", "style"], - :properties => - {:pos => {:'$ref' => '#/definitions/pos'}, - :text => {:type => "string"}, - :style => {:type => "string"}}}, - :right => {:type => "object", - :required => ["pos", "text", "style"], - :properties => - {:pos => {:'$ref' => '#/definitions/pos'}, - :text => {:type => "string"}, - :style => {:type => "string"}}}}}, - :layoutlines => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}, - :legend => {:type => "object", - :required => ["spos", "pos"], - :properties => - {:spos => {:"$ref" => "#/definitions/pos"}, - :pos => {:"$ref" => "#/definitions/pos"} - } - }, - :lyrics => {:type => "object", - :patternProperties => - {".*" => { - :type => "object", - :required => ["verses", "pos"] - }} - }, - :layout => {:'$ref' => '#/definitions/extract_layout'}, - :nonflowrest => {:type => "boolean"}, - :notes => {:patternProperties => {'.*' => {:"$ref" => '#/definitions/notes_entry'}}}, - :notebound => { - :type => 'object', - :additionalProperties => false, - :properties => { - :annotation => {:'$ref' => '#/definitions/notebound_pos'}, - :barnumber => {:'$ref' => '#/definitions/notebound_pos'}, - :c_jumplines => {:type => 'object', - :additionalProperties => false, - :patternProperties => { - "v_\d*" => { - :p_repeat => {type: 'number'}, - :p_begin => {type: 'number'}, - :p_end => {type: 'number'}, - :p_follow => {type: 'number'} - } - }}, - :countnote => {:'$ref' => '#/definitions/notebound_pos'}, - :decoration => {:'$ref' => '#/definitions/notebound_pos'}, - :flowline => {:type => 'object', - :patternProperties => { - "v_\d*" => { - :type => 'object', - :patternProperties => { - "\d*" => {'$ref' => '#/definitions/annotated_bezier'} - } - } - } - }, - :minc => {:type => "object", - :additionalProperties => false, - :patternProperties => { - "\d*" => {:'$ref' => '#/definitions/minc_entry'} - } - }, - :partname => {:'$ref' => '#/definitions/notebound_pos'}, - :repeat_begin => {:'$ref' => '#/definitions/notebound_pos'}, - :repeat_end => {:'$ref' => '#/definitions/notebound_pos'}, - :tuplet => {:type => 'object', - :patternProperties => { - "v_\d*" => { - :type => 'object', - :patternProperties => { - "\d*" => {'$ref' => '#/definitions/annotated_bezier'} - } - } - } - }, - :variantend => {:'$ref' => '#/definitions/notebound_pos'}, - } - }, - :barnumbers => {:type => "object", - :required => ["voices", "pos", "autopos", "style", "prefix"], - :properties => - {:voices => {:type => "array", - :minItems => 0, - :uniqueItems => true, - :items => {}}, - :pos => {:'$ref' => '#/definitions/pos'}, - :autopos => {:type => "boolean"}, - :style => {:type => "string"}, - :prefix => {:type => "string"}}}, - :countnotes => {:type => "object", - :required => ["voices", "pos", "autopos", "style"], - :properties => - {:voices => {:type => "array", - :minItems => 0, - :uniqueItems => true, - :items => {}}, - :pos => {:'$ref' => '#/definitions/pos'}, - :autopos => {:type => "boolean"}, - :style => {:type => "string"}}}, - :stringnames => {:type => "object", - :required => ["text", "vpos", "style", "marks"], - :properties => - {:text => {:type => "string"}, - :vpos => {:type => "array", + :items => {:type => "integer"}}, + :pos => {:'$ref' => '#/definitions/pos'}}}, + :tuplet => {:type => "object", + :required => ["cp1", "cp2", "shape"], + :properties => + {:cp1 => {:'$ref' => '#/definitions/pos'}, + :cp2 => {:'$ref' => '#/definitions/pos'}, + :shape => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "string"}}}}, + :annotations => {:type => "object", + :required => ["text", "pos"], + :properties => + {:text => {:type => "string"}, + :pos => {:'$ref' => '#/definitions/pos'}}}}}, + :annotations => {:type => "object", + :required => ["vl", "vt", "vr"], + :properties => + {:vl => {:type => "object", + :required => ["text", "pos"], + :properties => + {:text => {:type => "string"}, + :pos => {:'$ref' => '#/definitions/pos'}}}, + :vt => {:type => "object", + :required => ["text", "pos"], + :properties => + {:text => {:type => "string"}, + :pos => {:'$ref' => '#/definitions/pos'}}}, + :vr => {:type => "object", + :required => ["text", "pos"], + :properties => + {:text => {:type => "string"}, + :pos => {:'$ref' => '#/definitions/pos'}}}}}, + :extract => {:type => "object", + #:required => ["0", "1", "2", "3"], + :patternProperties => + {:"\d*" => {:type => "object", + :additionalProperties => false, + :requiredx => + ["title", "filenamepart", "startpos", "voices", "synchlines", + "flowlines", "subflowlines", "jumplines", "repeatsigns", "layoutlines", + "legend", "lyrics", "layout", "nonflowrest", "notes", "barnumbers", + "countnotes", "stringnames", "printer"], + :properties => + {:title => {:type => "string"}, + :filenamepart => {}, + :startpos => {:type => "integer"}, + :voices => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}, + :synchlines => {:type => "array", + :minItems => 0, + :uniqueItems => true, + :items => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}}, + :flowlines => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}, + :subflowlines => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}, + :jumplines => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}, + :repeatsigns => {:type => "object", + :requiredx => ["voices", "left", "right"], + :properties => + {:voices => {:type => "array", :minItems => 0, :uniqueItems => true, :items => {}}, - :style => {:type => "string"}, - :marks => {:type => "object", - :required => ["vpos", "hpos"], + :left => {:type => "object", + :required => ["pos", "text", "style"], :properties => - {:vpos => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}, - :hpos => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}}}}}, - :sortmark => {:type => 'object', - :properties => { - :show => {:type => 'boolean'} - } - }, - :printer => {:type => "object", - :required => ["a3_offset", "a4_offset", "show_border"], - :properties => - {:a3_offset => {:type => "array", - :minItems => 2, - :axItems => 2, - :uniqueItems => false, - :items => {:type => "integer"}}, - :a4_offset => {:type => "array", - :minItems => 2, - :uniqueItems => false, - :items => {:type => "integer"}}, - :show_border => {:type => "boolean"}}}}}, - :"4" => {:type => "object", - :required => ["title", "voices"], - :properties => - {:title => {:type => "string"}, - :filenamepart => {}, - :voices => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}}}, - :"5" => {:type => "object", - :required => ["title", "voices"], - :properties => - {:title => {:type => "string"}, - :filenamepart => {}, - :voices => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}}}}}, - :layout => {:type => "object", - :required => ["grid", "limit_a3", "SHOW_SLUR", "LINE_THIN", "LINE_MEDIUM", "LINE_THICK", "ELLIPSE_SIZE", "REST_SIZE", "X_SPACING", "X_OFFSET", "Y_SCALE", "DRAWING_AREA_SIZE", "BEAT_RESOLUTION", "SHORTEST_NOTE", "BEAT_PER_DURATION", "PITCH_OFFSET", "FONT_STYLE_DEF", "MM_PER_POINT", "DURATION_TO_STYLE", "REST_TO_GLYPH"], - :properties => - {:grid => {:type => "boolean"}, - :limit_a3 => {:type => "boolean"}, - :SHOW_SLUR => {:type => "boolean"}, - :LINE_THIN => {:type => "number"}, - :LINE_MEDIUM => {:type => "number"}, - :LINE_THICK => {:type => "number"}, - :ELLIPSE_SIZE => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "number"}}, - :REST_SIZE => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "number"}}, - :X_SPACING => {:type => "number"}, - :X_OFFSET => {:type => "number"}, - :Y_SCALE => {:type => "integer"}, - :DRAWING_AREA_SIZE => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => {:type => "integer"}}, - :BEAT_RESOLUTION => {:type => "integer"}, - :SHORTEST_NOTE => {:type => "integer"}, - :BEAT_PER_DURATION => {:type => "integer"}, - :PITCH_OFFSET => {:type => "integer"}, - :FONT_STYLE_DEF => {:type => "object", - :required => ["bold", "italic", "large", "regular", "small_bold", "small_italic", "small", "smaller"], - :patternProperties => - {".*" => {:type => "object", - :required => ["text_color", "font_size", "font_style"], - :properties => - {:text_color => {:type => "array", - :minItems => 3, - :uniqueItems => false, - :items => {:type => "integer"}}, - :font_size => {:type => "integer"}, - :font_style => {:type => "string"}}} #, - # :italic => {:type => "object", - # :required => ["text_color", "font_size", "font_style"], - # :properties => - # {:text_color => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "integer"}}, - # :font_size => {:type => "integer"}, - # :font_style => {:type => "string"}}}, - # :large => {:type => "object", - # :required => ["text_color", "font_size", "font_style"], - # :properties => - # {:text_color => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "integer"}}, - # :font_size => {:type => "integer"}, - # :font_style => {:type => "string"}}}, - # :regular => {:type => "object", - # :required => ["text_color", "font_size", "font_style"], - # :properties => - # {:text_color => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "integer"}}, - # :font_size => {:type => "integer"}, - # :font_style => {:type => "string"}}}, - # :small_bold => {:type => "object", - # :required => ["text_color", "font_size", "font_style"], - # :properties => - # {:text_color => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "integer"}}, - # :font_size => {:type => "integer"}, - # :font_style => {:type => "string"}}}, - # :small_italic => {:type => "object", - # :required => ["text_color", "font_size", "font_style"], - # :properties => - # {:text_color => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "integer"}}, - # :font_size => {:type => "integer"}, - # :font_style => {:type => "string"}}}, - # :small => {:type => "object", - # :required => ["text_color", "font_size", "font_style"], - # :properties => - # {:text_color => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "integer"}}, - # :font_size => {:type => "integer"}, - # :font_style => {:type => "string"}}}, - # :smaller => {:type => "object", - # :required => ["text_color", "font_size", "font_style"], - # :properties => - # {:text_color => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "integer"}}, - # :font_size => {:type => "integer"}, - # :font_style => {:type => "string"}}} - } - }, - :MM_PER_POINT => {:type => "number"}, - :DURATION_TO_STYLE => {:type => "object", - :required => ["err", "d64", "d48", "d32", "d24", "d16", "d12", "d8", "d6", "d4", "d3", "d2", "d1"], - :patternProperties => - {".*" => {:type => "array", - :minItems => 3, - :uniqueItems => false, - :items => {:type => ["number", "string", "boolean"]}} #, - # :d64 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "integer"}}, - # :d48 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d32 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d24 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d16 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d12 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d8 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d6 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d4 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d3 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d2 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}, - # :d1 => {:type => "array", - # :minItems => 1, - # :uniqueItems => true, - # :items => {:type => "number"}}} - }}, - :REST_TO_GLYPH => {:type => "object", - # :required => ["err", "d64", "d48", "d32", "d24", "d16", "d12", "d8", "d6", "d4", "d3", "d2", "d1"], - :patternProperties => - {'.*' => {:type => "array", - :minItems => 1, - :uniqueItems => true, - :items => [{:type => "array", - :minItems => 1, + {:pos => {:'$ref' => '#/definitions/pos'}, + :text => {:type => "string"}, + :style => {:type => "string"}}}, + :right => {:type => "object", + :required => ["pos", "text", "style"], + :properties => + {:pos => {:'$ref' => '#/definitions/pos'}, + :text => {:type => "string"}, + :style => {:type => "string"}}}}}, + :layoutlines => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}, + :legend => {:type => "object", + :required => ["spos", "pos"], + :properties => + {:spos => {:"$ref" => "#/definitions/pos"}, + :pos => {:"$ref" => "#/definitions/pos"} + } + }, + :lyrics => {:type => "object", + :patternProperties => + {".*" => { + :type => "object", + :required => ["verses", "pos"] + }} + }, + :layout => {:'$ref' => '#/definitions/extract_layout'}, + :nonflowrest => {:type => "boolean"}, + :notes => {:patternProperties => {'.*' => {:"$ref" => '#/definitions/notes_entry'}}}, + :notebound => { + :type => 'object', + :additionalProperties => false, + :properties => { + :annotation => {:'$ref' => '#/definitions/notebound_pos'}, + :barnumber => {:'$ref' => '#/definitions/notebound_pos'}, + :c_jumplines => {:type => 'object', + :additionalProperties => false, + :patternProperties => { + "v_\d*" => { + :p_repeat => {type: 'number'}, + :p_begin => {type: 'number'}, + :p_end => {type: 'number'}, + :p_follow => {type: 'number'} + } + }}, + :countnote => {:'$ref' => '#/definitions/notebound_pos'}, + :decoration => {:'$ref' => '#/definitions/notebound_pos'}, + :flowline => {:type => 'object', + :patternProperties => { + "v_\d*" => { + :type => 'object', + :patternProperties => { + "\d*" => {'$ref' => '#/definitions/annotated_bezier'} + } + } + } + }, + :minc => {:type => "object", + :additionalProperties => false, + :patternProperties => { + "\d*" => {:'$ref' => '#/definitions/minc_entry'} + } + }, + :partname => {:'$ref' => '#/definitions/notebound_pos'}, + :repeat_begin => {:'$ref' => '#/definitions/notebound_pos'}, + :repeat_end => {:'$ref' => '#/definitions/notebound_pos'}, + :tuplet => {:type => 'object', + :patternProperties => { + "v_\d*" => { + :type => 'object', + :patternProperties => { + "\d*" => {'$ref' => '#/definitions/annotated_bezier'} + } + } + } + }, + :variantend => {:'$ref' => '#/definitions/notebound_pos'}, + } + }, + :barnumbers => {:type => "object", + :required => ["voices", "pos", "autopos", "style", "prefix"], + :properties => + {:voices => {:type => "array", + :minItems => 0, + :uniqueItems => true, + :items => {}}, + :pos => {:'$ref' => '#/definitions/pos'}, + :autopos => {:type => "boolean"}, + :style => {:type => "string"}, + :prefix => {:type => "string"}}}, + :countnotes => {:type => "object", + :required => ["voices", "pos", "autopos", "style"], + :properties => + {:voices => {:type => "array", + :minItems => 0, + :uniqueItems => true, + :items => {}}, + :pos => {:'$ref' => '#/definitions/pos'}, + :autopos => {:type => "boolean"}, + :style => {:type => "string"}}}, + :stringnames => {:type => "object", + :required => ["text", "vpos", "style", "marks"], + :properties => + {:text => {:type => "string"}, + :vpos => {:type => "array", + :minItems => 0, + :uniqueItems => true, + :items => {}}, + :style => {:type => "string"}, + :marks => {:type => "object", + :required => ["vpos", "hpos"], + :properties => + {:vpos => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}, + :hpos => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}}}}}, + :sortmark => {:type => 'object', + :properties => { + :show => {:type => 'boolean'} + } + }, + :printer => {:type => "object", + :required => ["a3_offset", "a4_offset", "show_border"], + :properties => + {:a3_offset => {:type => "array", + :minItems => 2, + :axItems => 2, + :uniqueItems => false, + :items => {:type => "integer"}}, + :a4_offset => {:type => "array", + :minItems => 2, :uniqueItems => false, - :items => {:type => "number"}}, - {:type => "string"}, - {:type => "boolean"}]} + :items => {:type => "integer"}}, + :show_border => {:type => "boolean"}}}}}, + :"4" => {:type => "object", + :required => ["title", "voices"], + :properties => + {:title => {:type => "string"}, + :filenamepart => {}, + :voices => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}}}, + :"5" => {:type => "object", + :required => ["title", "voices"], + :properties => + {:title => {:type => "string"}, + :filenamepart => {}, + :voices => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}}}}}, + :layout => {:type => "object", + :required => ["grid", "limit_a3", "SHOW_SLUR", "LINE_THIN", "LINE_MEDIUM", "LINE_THICK", "ELLIPSE_SIZE", "REST_SIZE", "X_SPACING", "X_OFFSET", "Y_SCALE", "DRAWING_AREA_SIZE", "BEAT_RESOLUTION", "SHORTEST_NOTE", "BEAT_PER_DURATION", "PITCH_OFFSET", "FONT_STYLE_DEF", "MM_PER_POINT", "DURATION_TO_STYLE", "REST_TO_GLYPH"], + :properties => + {:grid => {:type => "boolean"}, + :limit_a3 => {:type => "boolean"}, + :SHOW_SLUR => {:type => "boolean"}, + :LINE_THIN => {:type => "number"}, + :LINE_MEDIUM => {:type => "number"}, + :LINE_THICK => {:type => "number"}, + :ELLIPSE_SIZE => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "number"}}, + :REST_SIZE => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "number"}}, + :X_SPACING => {:type => "number"}, + :X_OFFSET => {:type => "number"}, + :Y_SCALE => {:type => "integer"}, + :DRAWING_AREA_SIZE => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => {:type => "integer"}}, + :BEAT_RESOLUTION => {:type => "integer"}, + :SHORTEST_NOTE => {:type => "integer"}, + :BEAT_PER_DURATION => {:type => "integer"}, + :PITCH_OFFSET => {:type => "integer"}, + :FONT_STYLE_DEF => {:type => "object", + :required => ["bold", "italic", "large", "regular", "small_bold", "small_italic", "small", "smaller"], + :patternProperties => + {".*" => {:type => "object", + :required => ["text_color", "font_size", "font_style"], + :properties => + {:text_color => {:type => "array", + :minItems => 3, + :uniqueItems => false, + :items => {:type => "integer"}}, + :font_size => {:type => "integer"}, + :font_style => {:type => "string"}}} #, + # :italic => {:type => "object", + # :required => ["text_color", "font_size", "font_style"], + # :properties => + # {:text_color => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "integer"}}, + # :font_size => {:type => "integer"}, + # :font_style => {:type => "string"}}}, + # :large => {:type => "object", + # :required => ["text_color", "font_size", "font_style"], + # :properties => + # {:text_color => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "integer"}}, + # :font_size => {:type => "integer"}, + # :font_style => {:type => "string"}}}, + # :regular => {:type => "object", + # :required => ["text_color", "font_size", "font_style"], + # :properties => + # {:text_color => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "integer"}}, + # :font_size => {:type => "integer"}, + # :font_style => {:type => "string"}}}, + # :small_bold => {:type => "object", + # :required => ["text_color", "font_size", "font_style"], + # :properties => + # {:text_color => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "integer"}}, + # :font_size => {:type => "integer"}, + # :font_style => {:type => "string"}}}, + # :small_italic => {:type => "object", + # :required => ["text_color", "font_size", "font_style"], + # :properties => + # {:text_color => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "integer"}}, + # :font_size => {:type => "integer"}, + # :font_style => {:type => "string"}}}, + # :small => {:type => "object", + # :required => ["text_color", "font_size", "font_style"], + # :properties => + # {:text_color => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "integer"}}, + # :font_size => {:type => "integer"}, + # :font_style => {:type => "string"}}}, + # :smaller => {:type => "object", + # :required => ["text_color", "font_size", "font_style"], + # :properties => + # {:text_color => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "integer"}}, + # :font_size => {:type => "integer"}, + # :font_style => {:type => "string"}}} + } + }, + :MM_PER_POINT => {:type => "number"}, + :DURATION_TO_STYLE => {:type => "object", + :required => ["err", "d64", "d48", "d32", "d24", "d16", "d12", "d8", "d6", "d4", "d3", "d2", "d1"], + :patternProperties => + {".*" => {:type => "array", + :minItems => 3, + :uniqueItems => false, + :items => {:type => ["number", "string", "boolean"]}} #, + # :d64 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "integer"}}, + # :d48 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d32 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d24 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d16 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d12 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d8 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d6 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d4 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d3 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d2 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}, + # :d1 => {:type => "array", + # :minItems => 1, + # :uniqueItems => true, + # :items => {:type => "number"}}} + }}, + :REST_TO_GLYPH => {:type => "object", + # :required => ["err", "d64", "d48", "d32", "d24", "d16", "d12", "d8", "d6", "d4", "d3", "d2", "d1"], + :patternProperties => + {'.*' => {:type => "array", + :minItems => 1, + :uniqueItems => true, + :items => [{:type => "array", + :minItems => 1, + :uniqueItems => false, + :items => {:type => "number"}}, + {:type => "string"}, + {:type => "boolean"}]} - } - } + } } + } }, - :neatjson => {:type => "object", - :required => ["wrap", "aligned", "after_comma", "after_colon_1", "after_colon_n", "before_colon_n", "explicit_sort"], - :properties => - {:wrap => {:type => "integer"}, - :aligned => {:type => "boolean"}, - :after_comma => {:type => "integer"}, - :after_colon_1 => {:type => "integer"}, - :after_colon_n => {:type => "integer"}, - :before_colon_n => {:type => "integer"}, - :sorted => {:type => "boolean"}, - :explicit_sort => {:type => "object"} - }}}} + :neatjson => {:type => "object", + :required => ["wrap", "aligned", "after_comma", "after_colon_1", "after_colon_n", "before_colon_n", "explicit_sort"], + :properties => + {:wrap => {:type => "integer"}, + :aligned => {:type => "boolean"}, + :after_comma => {:type => "integer"}, + :after_colon_1 => {:type => "integer"}, + :after_colon_n => {:type => "integer"}, + :before_colon_n => {:type => "integer"}, + :sorted => {:type => "boolean"}, + :explicit_sort => {:type => "object"} + }}}} end end diff --git a/30_sources/SRC_Zupfnoter/src/user-interface.js b/30_sources/SRC_Zupfnoter/src/user-interface.js index 660579e6..018a9168 100644 --- a/30_sources/SRC_Zupfnoter/src/user-interface.js +++ b/30_sources/SRC_Zupfnoter/src/user-interface.js @@ -2,18 +2,149 @@ function init_w2ui(uicontroller) { w2popup.defaults.speed = 0; + var zoomlevel = [1400, 2200]; + var current_perspective = 'tb_perspective:Alle'; + var isFullScreen = false; + + +// file import methods + + + function pasteXml(text) { + // try { + // var xmldata = $.parseXML(text); + // } + // catch (ex) { + // #{$log.error(`ex.message`)} + // } + + var xmldata = $.parseXML(text); + + var options = { + 'u': 0, 'b': 0, 'n': 0, // unfold repeats (1), bars per line, chars per line + 'c': 0, 'v': 0, 'd': 0, // credit text filter level (0-6), no volta on higher voice numbers (1), denominator unit length (L:) + 'm': 0, 'x': 0, // with midi volume and panning (1), no line breaks (1) + 'p': 'f' + }; // page format: scale (1.0), width, left- and right margin in cm + + var result = vertaal(xmldata, options); + + + debugger; + uicontroller.dropped_abc = result[0] + + uicontroller.$handle_command('drop') + } + + function pasteMxl(text) { + zip = new JSZip(text) + text = zip.file(/^[^/ ]*\.xml$/)[0].asText(); + pasteXml(text); + } + + function pasteAbc(text) { + uicontroller.dropped_abc = text + uicontroller.$handle_command('drop') + } + + function handleDrop(event) { + event.stopPropagation(); + event.preventDefault(); + files = event.target.files; + if (!files) { + files = event.dataTransfer.files; + } + reader = new FileReader(); + + reader.onload = function (e) { + text = e.target.result; + if (text[0] == '<') { + pasteXml(text); + } + else if (files[0].name.endsWith(".mxl")) { + pasteMxl(text) + } + else { + pasteAbc(text); + } + } + if (files[0].name.endsWith('.mxl')) { + reader.readAsBinaryString(files[0]); + } + else { + reader.readAsText(files[0], "UTF-8"); + } + } + + + function handleDragover(event) { + event.stopPropagation(); + event.preventDefault(); + event.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy. + } + + function initializeFileDrop(element) { + var a = document.getElementById(element); + a.addEventListener('dragover', handleDragover, false); + a.addEventListener('drop', handleDrop); + } + + document.getElementById('file_input') + .addEventListener('change', function(event){debugger;handleDrop(event)}, false); + + initializeFileDrop('layout'); + + function readSingleFile(e) { + var file = e.target.files[0]; + if (!file) { + return; + } + var reader = new FileReader(); + reader.onload = function(e) { + var contents = e.target.result; + displayContents(contents); + }; + reader.readAsText(file); + } + + + +// UI-Methods function zoomHarpPreview(size) { uicontroller.$set_harppreview_size(size); $("#harpPreview svg").attr('height', size[1]).attr('width', size[0]); }; + function createNewSheet() { + openPopup({ + name: 'createNewSheetForm', + text: w2utils.lang('Create new Sheet'), + style: 'border: 0px; background-color: transparent;', + fields: [ + {field: 'id', type: 'string', required: true, html: {caption: 'X:'}}, + { + field: 'title', + type: 'text', + required: true, + tooltip: "Enter the title of your sheet", + html: {caption: w2utils.lang('Title'), attr: 'style="width: 300px"'} + } + ], + actions: { + "Ok": function () { + if (this.validate().length == 0) { + uicontroller.$handle_command("c " + this.record.id + '"' + this.record.title + '"'); + w2popup.close(); + } + }, + "Cancel": function () { + w2popup.close(); + } + } + }) + } - - var zoomlevel = [1400, 2200]; - var current_perspective = 'tb_perspective:Alle'; - var isFullScreen = false; - function open_data_uri_window(url) { var url_with_name = url.replace("data:application/pdf;", "data:application/pdf;name=myname.pdf;") @@ -37,7 +168,7 @@ function init_w2ui(uicontroller) { url = uicontroller.$render_a4().$output('datauristring') open_data_uri_window(url) }, - + 'tbPreview:tbPrintNotes': function () { a = window.open(); // a.document.write(''); @@ -107,6 +238,10 @@ function init_w2ui(uicontroller) { } toolbarhandlers = { + 'tb_file:tb_create': createNewSheet, + 'tb_file:tb_import': function(){ $('#file_input').click()}, + 'tb_file:tb_export': function(){uicontroller.$handle_command("download_abc")}, + 'tb_view:0': function () { uicontroller.$handle_command("view 0") }, @@ -134,34 +269,7 @@ function init_w2ui(uicontroller) { uicontroller.$render_previews(); }, - 'tb_create': function () { - openPopup({ - name: 'createNewSheetForm', - text: w2utils.lang('Create new Sheet'), - style: 'border: 0px; background-color: transparent;', - fields: [ - {field: 'id', type: 'string', required: true, html: {caption: 'X:'}}, - { - field: 'title', - type: 'text', - required: true, - tooltip: "Enter the title of your sheet", - html: {caption: w2utils.lang('Title'), attr: 'style="width: 300px"'} - } - ], - actions: { - "Ok": function () { - if (this.validate().length == 0) { - uicontroller.$handle_command("c " + this.record.id + '"' + this.record.title + '"'); - w2popup.close(); - } - }, - "Cancel": function () { - w2popup.close(); - } - } - }) - }, + 'tb_create': createNewSheet, 'tb_open': function () { uicontroller.$handle_command("dchoose") @@ -218,7 +326,7 @@ function init_w2ui(uicontroller) { var tbstyle = 'background-color: #ffffff; padding: 0px; overflow:hidden; height:30px;'; // toolbar style var sbstyle = 'background-color: #ffffff; padding: 0 px; overflow:hidden; height:30px;border-top:1px solid black !important;'; // statusbar style - toggle_full_screen = function() { + function toggle_full_screen() { if (isFullScreen) { perspectives[current_perspective](); isFullScreen = false; @@ -229,7 +337,9 @@ function init_w2ui(uicontroller) { } } - this.toggle_full_screen = function(){toggle_full_screen();} + this.toggle_full_screen = function () { + toggle_full_screen(); + } var toolbar = { id: 'toolbar', @@ -238,6 +348,30 @@ function init_w2ui(uicontroller) { items: [ {type: 'button', id: 'tb_home', icon: 'fa fa-home', text: 'Zupfnoter'}, {type: 'html', html: '
'}, + { + type: 'menu', + id: 'tb_file', + text: 'File', + icon: 'fa fa-file', + tooltip: 'interact with local files', + items: [ + {type: 'button', id: 'tb_create', text: 'New', icon: 'fa fa-file-o', tooltip: 'Create new sheet'}, + { + type: 'button', + id: 'tb_import', + text: 'Import', + icon: 'fa fa-upload', + tooltip: 'import abc, xml from local system' + }, + { + type: 'button', + id: 'tb_export', + text: 'Dl abc', + icon: 'fa fa-download', + tooltip: 'download abc to local system' + }, + ] + }, {type: 'button', id: 'tb_create', text: 'New', icon: 'fa fa-file-o', tooltip: 'Create new sheet'}, { type: 'button', @@ -452,7 +586,7 @@ function init_w2ui(uicontroller) { if (event.target == "tb_home") { - window.open("https://www.zupfnoter.de") + w2popup.open( {title: 'About Zupfnoter', body: uicontroller.$about_zupfnoter()}) } if (event.target == "tbHelp:tbVersionInfo") { window.open(uicontroller.$info_url()) @@ -555,7 +689,12 @@ function init_w2ui(uicontroller) { icon: 'fa fa-pencil', tooltip: "Edit configuration with forms", items: [ - {id: 'extract_annotation', text: 'Extract-Annotation', icon: 'fa fa-bars', tooltip: "Edit annotations of an extract"}, + { + id: 'extract_annotation', + text: 'Extract-Annotation', + icon: 'fa fa-bars', + tooltip: "Edit annotations of an extract" + }, { id: 'notes', text: 'page annotation', @@ -563,9 +702,19 @@ function init_w2ui(uicontroller) { tooltip: "edit settings for sheet annotations\nin current extract" }, {}, - {id: 'basic_settings', text: 'basic settings', icon: 'fa fa-heartbeat', tooltip: "Edit basic settings of extract"}, + { + id: 'basic_settings', + text: 'basic settings', + icon: 'fa fa-heartbeat', + tooltip: "Edit basic settings of extract" + }, {id: 'lyrics', text: 'lyrics', icon: 'fa fa-font', tooltip: "edit settings for lyrics\nin current extract"}, - {id: 'layout', text: 'layout', icon: 'fa fa-align-center', tooltip: "Edit layout paerameters\nin current extract"}, + { + id: 'layout', + text: 'layout', + icon: 'fa fa-align-center', + tooltip: "Edit layout paerameters\nin current extract" + }, { id: 'instrument_specific', text: 'instrument specific', @@ -593,7 +742,12 @@ function init_w2ui(uicontroller) { tooltip: "edit settings for sheet annotations\nin current extract" }, {}, - {id: 'stringnames', icon: 'fa fa-ellipsis-h', text: 'Stringnames', tooltip: "Edit presentation of stringanmes"}, + { + id: 'stringnames', + icon: 'fa fa-ellipsis-h', + text: 'Stringnames', + tooltip: "Edit presentation of stringanmes" + }, {id: 'printer', icon: 'fa fa-print', text: 'Printer adapt', tooltip: "Edit printer correction paerameters"}, {}, {id: 'minc', icon: 'fa fa-adjust', text: 'minc', tooltip: "edit extra increments"} @@ -722,11 +876,11 @@ function init_w2ui(uicontroller) { var editortabshtml = '
' - + '
' - + '
' - + '
' - + '
' - ; + + '
' + + '
' + + '
' + + '
' + ; var editortabsconfig = { name: 'editortabs', @@ -847,11 +1001,16 @@ function init_w2ui(uicontroller) { w2ui['layout'].onResize = function (event) { uicontroller.editor.$resize(); - }; + } } ; +/* + here we have some entry points to be used by controller + TODO: refactor this? + */ + function set_tbitem_caption(item, caption) { w2ui.layout_top_toolbar.set(item, {text: caption}); } @@ -869,6 +1028,7 @@ function update_systemstatus_w2ui(systemstatus) { $(".sb-mode").html(w2utils.lang('Mode') + ': ' + systemstatus.mode); if (systemstatus.mode == 'demo') { + w2ui.layout_top_toolbar.disable('tb_file') w2ui.layout_top_toolbar.disable('tb_create') w2ui.layout_top_toolbar.disable('tb_open') w2ui.layout_top_toolbar.disable('tb_save') @@ -876,6 +1036,7 @@ function update_systemstatus_w2ui(systemstatus) { w2ui.layout_top_toolbar.disable('tb_login') } else { + w2ui.layout_top_toolbar.enable('tb_file') w2ui.layout_top_toolbar.enable('tb_create') w2ui.layout_top_toolbar.enable('tb_open') // w2ui.layout_top_toolbar.enable('tb_save') @@ -943,12 +1104,15 @@ function update_play_w2ui(status) { function disable_save() { w2ui.layout_top_toolbar.disable('tb_save') }; + function enable_save() { w2ui.layout_top_toolbar.enable('tb_save') }; + function before_open() { w2ui.layout_left_tabs.click('abcEditor') }; + function set_extract_menu(id, text) { w2ui.layout_top_toolbar.set('tb_view:' + id, {text: text}); w2ui.layout_top_toolbar.refresh(); diff --git a/30_sources/SRC_Zupfnoter/src/version.rb b/30_sources/SRC_Zupfnoter/src/version.rb index 64eec463..14bece20 100644 --- a/30_sources/SRC_Zupfnoter/src/version.rb +++ b/30_sources/SRC_Zupfnoter/src/version.rb @@ -1,3 +1,3 @@ -VERSION = "1.7.1" +VERSION = "1.8.0 dev 1" SCHEMA_VERSION = 'https://zupfnoter.weichel21.de/schema/zupfnoter-config_1.0.json' COPYRIGHT = "© #{Time.now.year} https://www.zupfnoter.de" diff --git a/30_sources/SRC_Zupfnoter/vendor/abc2svg-1.js b/30_sources/SRC_Zupfnoter/vendor/abc2svg-1.js index 05db45fb..82a4a43c 100644 --- a/30_sources/SRC_Zupfnoter/vendor/abc2svg-1.js +++ b/30_sources/SRC_Zupfnoter/vendor/abc2svg-1.js @@ -1,7 +1,7 @@ -// compiled for Zupfnoter 2017-08-18 09:14:06 +0200 +// compiled for Zupfnoter 2017-09-15 18:03:22 +0200 //#javascript // abc2svg - ABC to SVG translator -// @source: http://moinejf.free.fr/js/abc2svg.tar.gz.php +// @source: https://github.com/moinejf/abc2svg.git // Copyright (C) 2014-2017 Jean-Francois Moine // // This file is part of abc2svg-core. @@ -18,7 +18,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with abc2svg-core. If not, see . -var abc2svg={version:"1.13.7-2-g2e5cbb2",vdate:"2017-08-17"} +var abc2svg={version:"1.14.1-1-gb9d3cab",vdate:"2017-09-13"} // abc2svg - abc2svg.js // // Copyright (C) 2014-2017 Jean-Francois Moine @@ -115,7 +115,8 @@ var glovar = { prefix: '%', state: 0, line: new scanBuf() - } + }, + psvg // PostScript // utilities function clone(obj) { @@ -195,13 +196,13 @@ function scanBuf() { // this.buffer = buffer this.index = 0; - this.char = function() { + scanBuf.prototype.char = function() { return this.buffer[this.index] } - this.next_char = function() { + scanBuf.prototype.next_char = function() { return this.buffer[++this.index] } - this.get_int = function() { + scanBuf.prototype.get_int = function() { var val = 0, c = this.buffer[this.index] while (c >= '0' && c <= '9') { @@ -213,36 +214,12 @@ function scanBuf() { } function syntax(sev, msg, a1, a2, a3, a4) { - var regex, tmp - - if (user.textrans) { - tmp = user.textrans[msg] - if (tmp) - msg = tmp + var s = { + ctx: parse.ctx, + istart: parse.istart + parse.line.index } - if (arguments.length > 2) - msg = msg.replace(/\$./g, function(a) { - switch (a) { - case '$1': return a1 - case '$2': return a2 - case '$3': return a3 - default : return a4 - } - }) - errbld(sev, msg, parse.ctx.fname, parse.istart + parse.line.index) -} - -function empty_function() { -} -// general abc2svg initialization -function abc2svg_init() { - font_init() - if (!user.anno_start) - anno_start = empty_function - if (!user.anno_stop) - anno_stop = empty_function - init_tune() + error(sev, s, msg, a1, a2, a3, a4) } // abc2svg - deco.js - decorations // @@ -2154,7 +2131,7 @@ function draw_partempo(st, top) { /* + cfmt.partsspace ?? */ } w = strw(s.text); - y = y_get(st, true, s.x - 10, w + 15) + 5 + y = y_get(st, true, s.x - 10, w + 3) + 5 if (ymin < y) ymin = y } @@ -2248,9 +2225,7 @@ function b_pos(grace, stem, nflags, b) { d1 = rnd6(top - BEAM_OFFSET); d2 = rnd6(bot + BEAM_OFFSET) - if (d1 * d1 > d2 * d2) - return d2 - return d1 + return d1 * d1 > d2 * d2 ? d2 : d1 } /* duplicate a note for beaming continuation */ @@ -2406,23 +2381,16 @@ function calculate_beam(bm, s1) { b = (sy - a * sx) / notes /* the next few lines modify the slope of the beam */ -// if (!s1.grace) { - if (notes >= 3) { - hh = syy - a * sxy - b * sy /* flatten if notes not in line */ - if (hh > 0 - && hh / (notes - 2) > .5) - a *= BEAM_FLATFAC - } - if (a >= 0) - a = BEAM_SLOPE * a / (BEAM_SLOPE + a) // max steepness for beam - else - a = BEAM_SLOPE * a / (BEAM_SLOPE - a); -// } else { -// if (a > BEAM_SLOPE) -// a = BEAM_SLOPE -// else if (a < -BEAM_SLOPE) -// a = -BEAM_SLOPE -// } + if (notes >= 3) { + hh = syy - a * sxy - b * sy /* flatten if notes not in line */ + if (hh > 0 + && hh / (notes - 2) > .5) + a *= BEAM_FLATFAC + } + if (a >= 0) + a = BEAM_SLOPE * a / (BEAM_SLOPE + a) // max steepness for beam + else + a = BEAM_SLOPE * a / (BEAM_SLOPE - a); /* to decide if to draw flat etc. use normalized slope a0 */ a0 = a * (s2.xs - s1.xs) / (20 * (notes - 1)) @@ -2672,6 +2640,7 @@ function draw_beams(bm) { var y1, dy2, s = bm.s1, nflags = s.nflags + if (s.ntrem) nflags -= s.ntrem if (s.trem2 && n > nflags) { @@ -3119,11 +3088,8 @@ function draw_keysig(p_voice, x, s) { function bar_cnv(bar_type) { switch (bar_type) { case "[": -// case "]": case "[]": return "" /* invisible */ -// case ":": -// return "|" /* dotted */ case "|:": case "|::": case "|:::": @@ -3475,7 +3441,7 @@ function setdoty(s, y_tb) { // get the x and y position of a note head // (when the staves are defined) function x_head(s, note) { - return s.x + note.shhd // * stv_g.scale // ?? + return s.x + note.shhd } function y_head(s, note) { return staff_tb[s.st].y + 3 * (note.pit - 18) @@ -3494,9 +3460,6 @@ function draw_basic_note(x, s, m, y_tb) { x_note = x + shhd, y_note = y + staffb - if (s.invis) - return - // /* special case for voice unison */ // if (s.nohdi1 != undefined // && m >= s.nohdi1 && m < s.nohdi2) @@ -3603,7 +3566,6 @@ function draw_basic_note(x, s, m, y_tb) { /* draw the accidental */ if (note.acc) { -// && !s.perc) { x -= note.shac * stv_g.scale if (!s.grace) { draw_acc(x, y + staffb, @@ -3631,36 +3593,31 @@ function draw_note(s, note = s.notes[s.stem < 0 ? s.nhd : 0]; // master note head x = x_head(s, note); -//?? what was this used for ?? -// if (s.head == OVAL || s.head == SQUARE) -// x += 1; staffb = staff_tb[s.st].y /* output the ledger lines */ - if (!s.invis) { - if (s.grace) { - hltype = "ghl" - } else { - switch (s.head) { - default: - hltype = "hl" - break - case OVAL: - case OVALBARS: - hltype = "hl1" - break - case SQUARE: - hltype = "hl2" - break - } + if (s.grace) { + hltype = "ghl" + } else { + switch (s.head) { + default: + hltype = "hl" + break + case OVAL: + case OVALBARS: + hltype = "hl1" + break + case SQUARE: + hltype = "hl2" + break } - draw_hl(x, 3 * (s.notes[0].pit - 18), 3 * (s.notes[s.nhd].pit - 18), - s.st, hltype) } + draw_hl(x, 3 * (s.notes[0].pit - 18), 3 * (s.notes[s.nhd].pit - 18), + s.st, hltype) /* draw the stem and flags */ y = y_head(s, note) - if (!s.invis && !s.stemless) { + if (!s.stemless) { slen = s.ys - s.y; nflags = s.nflags if (s.ntrem) @@ -3687,9 +3644,7 @@ function draw_note(s, } /* draw the tremolo bars */ - if (!s.invis - && fl - && s.trem1) { + if (fl && s.trem1) { var ntrem = s.ntrem || 0, x1 = x; slen = 3 * (s.notes[s.stem > 0 ? s.nhd : 0].pit - 18) @@ -3720,11 +3675,6 @@ function next_scut(s) { var prev = s for (s = s.next; s; s = s.next) { -// if (s.type == BAR -// && (s.bar_type[0] == ':' -// || s.bar_type == "|]" -// || s.bar_type == "[|" -// || (s.text && s.text[0] != '1'))) if (s.rbstop) return s prev = s @@ -3736,11 +3686,6 @@ function next_scut(s) { function prev_scut(s) { while (s.prev) { s = s.prev -// if (s.type == BAR -// && (s.bar_type[0] == ':' -// || s.bar_type == "|]" -// || s.bar_type == "[|" -// || (s.text && s.text[0] != '1'))) if (s.rbstart) return s } @@ -3917,7 +3862,6 @@ function draw_slur(k1_o, k2, m1, m2, slur_type) { if (two_staves) error(2, k1, "*** multi-staves slurs not treated yet"); /* fix endpoints */ -// x1 = k1.x + k1.xmx /* take the max right side */ x1 = k1_o.x if (k1_o.notes && k1_o.notes[0].shhd) x1 += k1_o.notes[0].shhd @@ -3928,7 +3872,6 @@ if (two_staves) error(2, k1, "*** multi-staves slurs not treated yet"); } else { /* (the slur starts on last note of the line) */ for (k = k2.ts_next; k; k = k.ts_next) //fixme: must check if the staff continues -// if (k.new_sy) if (k.type == STAVES) break x2 = k ? k.x : realwidth @@ -4858,8 +4801,6 @@ function draw_note_ties(k1, k2, mhead1, mhead2, job) { time = k1.time + k1.dur for (k = k1.ts_next; k; k = k.ts_next) //(fixme: must check if the staff continues??) -// if (k.seqst || k.new_sy) -// break if (k.time > time) break x2 = k ? k.x : realwidth @@ -5008,7 +4949,7 @@ function tie_comb(s) { if (s1.time > time) return s // bad tie } - return null // no ending tie + return //null // no ending tie } /* -- draw all ties between neighboring notes -- */ @@ -5039,7 +4980,6 @@ function draw_all_ties(p_voice) { } s_rtie = p_voice.s_rtie /* tie from 1st repeat bar */ for (s2 = s1; s2; s2 = s2.next) { -// if (s2.type == NOTE if (s2.dur || s2.type == GRACE) break @@ -5058,7 +4998,6 @@ function draw_all_ties(p_voice) { s1 = p_voice.s_tie; p_voice.s_tie = null; s1.st = s2.st; -// s1.ts_next = tsfirst.next; /* (for tie to other voice) */ s1.ts_next = s2.ts_next; /* (for tie to other voice) */ s1.time = s2.time - s1.dur; /* (if after repeat sequence) */ draw_ties(s1, s2, 1) /* tie to 1st note */ @@ -5081,9 +5020,6 @@ function draw_all_ties(p_voice) { } if (s1.bar_type == '|') continue // not a repeat -// if (s1.bar_type == '[') -// && s1.prev.type != BAR) -// continue // not a repeat for (s2 = s1.next; s2; s2 = s2.next) if (s2.type == NOTE) break @@ -5149,21 +5085,6 @@ function draw_all_ties(p_voice) { clef_chg = true continue } -// if (s3.type == BAR) { -// if (s3.bar_type[0] == ':' -// || s3.bar_type == "|]" -// || s3.bar_type == "[|") { -// s2 = s3 -// break -// } -// if (!s3.text) // not a repeat bar -// continue -// if (s3.text[0] != '1') { -// s2 = s3 -// break -// } -// s_rtie = s1 /* 1st repeat bar */ -// } } /* ties with clef or staff change */ @@ -5273,6 +5194,7 @@ function draw_all_slurs(p_voice) { * - guitar chords * - staff decorations * - lyrics + * - measure numbers * The buffer output is delayed until the definition of the staff system */ function draw_sym_near() { @@ -5291,17 +5213,15 @@ function draw_sym_near() { if (g.beam_st && !g.beam_end) calculate_beam(bm, g) } - continue - default: - continue + break case NOTE: + if ((s.beam_st && !s.beam_end) + || (first_note && !s.beam_st)) { + first_note = false; + calculate_beam(bm, s) + } break } - if ((s.beam_st && !s.beam_end) - || (first_note && !s.beam_st)) { - first_note = false; - calculate_beam(bm, s) - } } } @@ -5466,8 +5386,6 @@ function draw_vname(indent) { if (!p_voice.sym) continue st = cur_sy.voices[v].st -// if (!cur_sy.staves[st]) -// continue if (!cur_sy.st_print[st]) continue if (p_voice.new_name) { @@ -5484,8 +5402,6 @@ function draw_vname(indent) { if (!p_voice.sym) continue st = cur_sy.voices[v].st -// if (!cur_sy.staves[st]) -// continue if (!cur_sy.st_print[st]) continue if (p_voice.new_name) @@ -5540,28 +5456,6 @@ function draw_vname(indent) { function set_staff() { var s, i, st, prev_staff, v, y, staffsep, dy, maxsep, mbot, val, p_voice, p_staff -// empty = [] - -// /* search the empty staves in each parts */ -// for (st = 0; st <= nstaff; st++) { -// staff_tb[st].empty = false; -// empty[st] = true -// } -// sy = cur_sy -// for (st = 0; st <= sy.nstaff; st++) { -// if (sy.st_print[st]) -// empty[st] = false -// } -////--fixme: could use sy.next with a stop flag -// for (s = tsfirst; s; s = s.ts_next) { -// if (s.type != STAVES) -// continue -// sy = sy.next -// for (st = 0; st <= sy.nstaff; st++) { -// if (sy.st_print[st]) -// empty[st] = false -// } -// } /* set the scale of the voices */ for (v = 0; v < voice_tb.length; v++) { @@ -5573,10 +5467,8 @@ function set_staff() { // search the top staff for (st = 0; st <= nstaff; st++) { -// if (!empty[st]) if (gene.st_print[st]) break -// staff_tb[st].empty = true } y = 0 if (st > nstaff) { @@ -5594,7 +5486,6 @@ function set_staff() { /* draw the parts and tempo indications if any */ y += draw_partempo(st, y) -// if (empty[st]) if (!gene.st_print[st]) return y; @@ -5613,10 +5504,6 @@ function set_staff() { var sy_staff_prev = cur_sy.staves[prev_staff] for (st++; st <= nstaff; st++) { p_staff = staff_tb[st] -// if (empty[st]) { -// p_staff.empty = true -// continue -// } if (!gene.st_print[st]) continue staffsep = sy_staff_prev.sep || cfmt.sysstaffsep; @@ -5676,7 +5563,6 @@ function set_staff() { if (mbot == 0) { for (st = nstaff; st >= 0; st--) { -// if (!empty[st]) if (gene.st_print[st]) break } @@ -5881,31 +5767,28 @@ function draw_systems(indent) { /* -- draw remaining symbols when the staves are defined -- */ function draw_symbols(p_voice) { var bm = {}, - s, g, x, y, st, first_note; + s, g, x, y, st; // bm.s2 = undefined - first_note = true for (s = p_voice.sym; s; s = s.next) { if (s.invis - && s.type != NOTE && s.type != REST - && s.type != GRACE) + && s.type != NOTE) // (beams may start on invisible notes) continue x = s.x; -// if (s.color) - set_color(s.color) + set_color(s.color) switch (s.type) { case NOTE: //--fixme: recall set_scale if different staff set_scale(s) - if ((s.beam_st && !s.beam_end) - || (first_note && !s.beam_st)) { - first_note = false + if (s.beam_st && !s.beam_end) { if (calculate_beam(bm, s)) draw_beams(bm) } - anno_start(s); - draw_note(s, !bm.s2); - anno_stop(s) + if (!s.invis) { + anno_start(s); + draw_note(s, !bm.s2); + anno_stop(s) + } if (s == bm.s2) bm.s2 = null break @@ -5924,8 +5807,7 @@ function draw_symbols(p_voice) { if (s.second) /* || p_voice.st != st) */ break /* only one clef per staff */ - if (s.invis - || staff_tb[st].empty) + if (staff_tb[st].empty) break set_color(undefined); set_sscale(st); @@ -5951,7 +5833,6 @@ function draw_symbols(p_voice) { xygl(x - 2, y, "oct") } anno_stop(s) -// set_scale(p_voice.sym) break case METER: p_voice.meter = s @@ -5965,7 +5846,6 @@ function draw_symbols(p_voice) { anno_start(s); draw_meter(x, s); anno_stop(s) -// set_scale(p_voice.sym) break case KEY: p_voice.key = s @@ -5977,17 +5857,12 @@ function draw_symbols(p_voice) { anno_start(s); draw_keysig(p_voice, x, s); anno_stop(s) -// set_scale(p_voice.sym) break case MREST: set_scale(s); x += 32; anno_start(s); xygl(x, staff_tb[s.st].y + 12, "mrest"); -// output.push('' + s.nmes + '\n') out_XYAB('A\n', x, staff_tb[s.st].y + 28, s.nmes); @@ -6002,7 +5877,6 @@ function draw_symbols(p_voice) { break /* nothing */ case CUSTOS: set_scale(s); -// s.stemless = true; draw_note(s, 0) break case BLOCK: // no width @@ -6030,7 +5904,6 @@ function draw_all_sym() { for (v = 0; v < n; v++) { p_voice = voice_tb[v] if (p_voice.sym -// && !staff_tb[p_voice.st].empty) && p_voice.sym.x != undefined) draw_symbols(p_voice) } @@ -6274,7 +6147,7 @@ Z "Transcription: "\n\ H "History: "', infospace: 0, keywarn: true, - leftmargin: 1.7 * CM, + leftmargin: 1.4 * CM, lineskipfac: 1.1, linewarn: true, maxshrink: .65, @@ -6298,7 +6171,7 @@ H "History: "', // vol: 0 // }, "print-leftmargin": 0, - rightmargin: 1.7 * CM, + rightmargin: 1.4 * CM, rbdbstop: true, rbmax: 4, rbmin: 2, @@ -6323,12 +6196,12 @@ H "History: "', vocalspace: 10, // voicecombine: 0, // voicescale: 1, - writefields: "CMOPQTWw", + writefields: "CMOPQsTWw", wordsspace: 5 } // exported function: return a parameter value -this.get_fmt = function(k) { +Abc.prototype.get_fmt = function(k) { return cfmt[k] } @@ -7617,9 +7490,10 @@ function tosvg(in_fname, // file name // info fields in tune body only case 's': - if (parse.state != 3) + if (parse.state != 3 + || cfmt.writefields.indexOf(line0) < 0) break -//--fixme: to do + get_sym(text, txt_add == ' ') break case 'w': if (parse.state != 3 @@ -8727,7 +8601,8 @@ function set_space(s) { while (!s.dur) { switch (s.type) { case BAR: - return space * .6 + // (hack to have quite the same note widths between measures) + return space * .9 - 7 case CLEF: return space - s.wl case BLOCK: // no space @@ -8779,6 +8654,24 @@ function set_space(s) { return space } +// create an invisible bar for end of music lines +function add_end_bar(s) { + return { + type: BAR, + bar_type: "|", + ctx: s.ctx, + istart: s.istart, + iend: s.iend, + v: s.v, + p_v: s.p_v, + st: s.st, + dur: 0, + seqst: true, + invis: true +//,wl:0,wr:0 + } +} + /* -- set the width and space of all symbols -- */ /* this function is called once for the whole tune * then, once per music line up to the first sequence */ @@ -8795,10 +8688,7 @@ function set_allsymwidth(last_s) { do { set_width(s) - if (xl[s.st]) - new_val = xl[s.st] + s.wl - else - new_val = s.wl + new_val = (xl[s.st] || 0) + s.wl if (new_val > maxx) maxx = new_val; s = s.ts_next @@ -8815,7 +8705,7 @@ function set_allsymwidth(last_s) { s2.time = s2.ts_prev.time } if (s == last_s) - return + break // update the min left space per staff xa = maxx; @@ -8826,6 +8716,28 @@ function set_allsymwidth(last_s) { s = s.ts_next } while (!s.seqst) } + + // if the last symbol of the tune is not a bar, add some extra space + if (last_s) + return + xa = 0 + for (s = s2; ; s = s.ts_next) { + if (s.type == BAR) + return + if (s.wr > xa) + xa = s.wr + if (!s.ts_next) + break + } + if (s.wr > xa) + xa = s.wr; + s2 = add_end_bar(s); + s2.prev = s2.ts_prev = s; + s.ts_next = s.next = s2; + s2.time = s.time + s.dur; + s2.shrink = xa; + s.eoln = false; + s2.space = set_space(s2) } /* change a symbol into a rest */ @@ -9317,11 +9229,6 @@ function set_lines( s, /* first symbol */ s2 = s3 if (s2) s = s2 - while (!s.x || s.x + s.shrink * 2 >= xmax) { - if (!s.ts_prev || s.ts_prev.nl) // don't go backwards - break - s = s.ts_prev - } } if (s.nl) { /* already set here - advance */ @@ -11795,6 +11702,21 @@ function set_piece() { p_voice.s_next = p_voice.sym; p_voice.sym = null } + + // if the last symbol is not a bar, add an invisible bar + if (tsnext.ts_prev.type != BAR) { + var s2 = tsnext.ts_prev; + while (!s2.seqst) + s2 = s2.ts_prev; + s = tsfirst; + tsfirst = s2; + var sh = s2.shrink, + sp = s2.space; + set_allsymwidth(); + s2.shrink = sh; + s2.space = sp; + tsfirst = s + } } /* -- position the symbols along the staff -- */ @@ -11808,8 +11730,8 @@ function set_sym_glue(width) { x = 0 while (1) { - if (s.type == GRACE) - some_grace = true + if (s.type == GRACE && !some_grace) + some_grace = s if (s.seqst) { space = s.space; xmin += s.shrink @@ -11893,38 +11815,6 @@ function set_sym_glue(width) { s = s.ts_next } - /* if the last symbol is not a bar, add some extra space */ - switch (s.type) { - case BAR: - case SPACE: - break - case CUSTOS: - x += s.wr; - xmin += s.wr; - xmax += s.wr - break - default: - min = s.wr - while (!s.seqst) { - s = s.ts_prev - if (s.wr > min) - min = s.wr - } - xmin += min - if (tsnext && tsnext.space * .8 > s.wr + 4) { - x += tsnext.space * .8 * spafac; - xmax += tsnext.space * .8 * spafac * 1.8 - } else if (s.dur) { - min += 10; - x += min + s.shrink; - xmax += min + s.space - } else { - x += min; - xmax += min - } - break - } - /* calculate the exact glue */ if (x >= width) { beta = 0 @@ -11986,18 +11876,16 @@ function set_sym_glue(width) { } /* set the x offsets of the grace notes */ - if (some_grace) { - for (s = tsfirst; s; s = s.ts_next) { - if (s.type != GRACE) - continue - if (s.gr_shift) - x = s.prev.x + s.prev.wr - + Number(cfmt.gracespace[0]) - else - x = s.x - s.wl + Number(cfmt.gracespace[0]) - for (g = s.extra; g; g = g.next) - g.x += x - } + for (s = some_grace; s; s = s.ts_next) { + if (s.type != GRACE) + continue + if (s.gr_shift) + x = s.prev.x + s.prev.wr + + Number(cfmt.gracespace[0]) + else + x = s.x - s.wl + Number(cfmt.gracespace[0]) + for (g = s.extra; g; g = g.next) + g.x += x } } @@ -12044,9 +11932,11 @@ function gen_init(page_chg) { return } switch (s.type) { -// case CLEF: -// case KEY: -// case METER: + case NOTE: + case REST: + case MREST: + set_page() + return default: continue case STAVES: @@ -12178,11 +12068,12 @@ function output_music() { if (!tsnext) break + blk_out(); + // next line gen_init() if (!tsfirst) break - blk_out(); tsfirst.ts_prev = null; set_sym_line(); lwidth = get_lwidth() // the image size may have changed @@ -12318,7 +12209,7 @@ function new_clef(clef_def) { } // get a transposition value -var pit_st = [0, 2, 4, 5, 7, 9, 11] +var pit_st = new Int8Array([0, 2, 4, 5, 7, 9, 11]) function get_transp(param, type) { // undefined or "instr" @@ -12537,14 +12428,6 @@ function new_block(subtype) { return s } -function next_word(parm, i) { - while (parm[i] && parm[i] != ' ') - i++ - while (parm[i] == ' ') - i++ - return i -} - // set the K: / V: parameters function set_kv_parm(a) { // array of items var s, item, pos, val @@ -12702,9 +12585,7 @@ function new_key(param) { switch (param[0]) { case 'A': s.k_sf = 3; break case 'B': s.k_sf = 5; break - case 'C': - s.k_sf = 0 - break + case 'C': s.k_sf = 0; break case 'D': s.k_sf = 2; break case 'E': s.k_sf = 4; break case 'F': s.k_sf = -1; break @@ -12801,20 +12682,13 @@ function new_key(param) { var note = parse_acc_pit(tmp) if (!note) return [s, null] -// var acc = { -// pit: note.pit, -// acc: note.acc -// } s.k_a_acc.push(note); -// c = tmp.char() c = param[tmp.index] while (c == ' ') -// c = tmp.next_char() c = param[++tmp.index] } while (c == '^' || c == '_' || c == '='); param = param.slice(tmp.index) } else if (s.k_exp && param.indexOf("none") == 0) { -// s.k_a_acc = []; s.k_sf = 0; param = param.replace(/\w+\s*/, '') } @@ -12839,7 +12713,7 @@ function new_meter(text) { i = 0, j, wmeasure, p = text, - in_parenth + in_parenth; set_ref(s) @@ -13032,31 +12906,24 @@ function new_tempo(text) { /* tempo value */ if (c == '=') { -// c = tmp.next_char() c = text[++tmp.index] while (c == ' ') -// c = tmp.next_char(); - c = text[++tmp.index]; + c = text[++tmp.index]; i = tmp.index if (c == 'c' && text[i + 1] == 'a' && text[i + 2] == '.' && text[i + 3] == ' ') { s.tempo_ca = 'ca. '; tmp.index += 4; -// c = tmp.char() - c = text[tmp.index] +// c = text[tmp.index] } -// if (c > '0' && c <= '9') { -//fixme: if "n/d", 'n' may be > 9 - not treated if (text[tmp.index + 1] != '/') { s.tempo = tmp.get_int() } else { nd = parse_dur(tmp); s.new_beat = BASE_LEN * nd[0] / nd[1] } -// c = tmp.char() c = text[tmp.index] while (c == ' ') -// c = tmp.next_char() c = text[++tmp.index] } @@ -13286,7 +13153,6 @@ function new_bar() { type: BAR, ctx: parse.ctx, istart: parse.bol + line.index, -// iend: parse.iend, dur: 0, multi: 0 // needed for decorations } @@ -13319,8 +13185,6 @@ function new_bar() { } } -/* curvoice.last_note = null; */ - // set the guitar chord and the decorations if (a_gch) gch_build(s) @@ -13406,7 +13270,6 @@ function new_bar() { /* remove the invisible repeat bars when no shift is needed */ if (bar_type == "[" -// && (curvoice.v == par_sy.top_voice && !s2.text && !s2.a_gch && (curvoice.st == 0 || (par_sy.staves[curvoice.st - 1].flags & STOP_BAR) @@ -13465,6 +13328,8 @@ function new_bar() { s.bar_type = bar_type if (!curvoice.lyric_restart) curvoice.lyric_restart = s + if (!curvoice.sym_restart) + curvoice.sym_restart = s /* the bar must appear before a key signature */ if (s2 && s2.type == KEY @@ -13486,8 +13351,6 @@ function new_bar() { && !curvoice.norepbra && curvoice.st > 0 && !(par_sy.staves[curvoice.st - 1].flags & STOP_BAR)) { -// ko: always shift! -// if (s.text) { s2 = { type: BAR, ctx: s.ctx, @@ -13638,7 +13501,7 @@ function parse_staves(p) { err = true } if (err || a_vf.length == 0) - return null + return //null return a_vf } @@ -13658,8 +13521,6 @@ function info_split(text) { break } item += '='; -// if (a.length < start) -// break a.push(item); item = "" break @@ -13709,7 +13570,6 @@ function identify_note(s, dur) { if (dur % 12 != 0) syntax(1, "Invalid note duration $1", dur); dur /= 12 /* see BASE_LEN for values */ -// dur = Math.round(dur / 12) if (dur == 0) syntax(1, "Note too short") for (flags = 5; dur != 0; dur >>= 1, flags--) { @@ -13896,7 +13756,7 @@ function parse_basic_note(line, ulen) { note = parse_acc_pit(line) if (!note) - return null + return //null // duration if (line.char() == '0') { // compatibility @@ -13926,9 +13786,9 @@ function parse_vpos() { return ti1 + SL_AUTO } -var cde2fcg = [0, 2, 4, -1, 1, 3, 5], - cgd2cde = [0, 4, 1, 5, 2, 6, 3], - acc2 = [-2, -1, 3, 1, 2] +var cde2fcg = new Int8Array([0, 2, 4, -1, 1, 3, 5]), + cgd2cde = new Int8Array([0, 4, 1, 5, 2, 6, 3]), + acc2 = new Int8Array([-2, -1, 3, 1, 2]) /* transpose a note / chord */ function note_transp(s) { @@ -13976,7 +13836,6 @@ function note_transp(s) { if (a && a != 3) // ! natural i3 += a * 7; -// i1 = (Math.floor((i3 + 1 + 21) / 7) + 2 - 3 + 32 * 5) % 5; i1 = ((((i3 + 1 + 21) / 7) | 0) + 2 - 3 + 32 * 5) % 5; a = acc2[i1] if (note.acc) { @@ -13999,8 +13858,8 @@ function note_transp(s) { } i1 = note.acc; d = note.micro_d - if (d /* microtone */ - && i1 != a) { /* different accidental type */ + if (d /* microtone */ + && i1 != a) { /* different accidental type */ n = note.micro_n //fixme: double sharps/flats ?*/ //fixme: does not work in all cases (tied notes, previous accidental) @@ -14044,11 +13903,9 @@ function note_transp(s) { /* sort the notes of the chord by pitch (lowest first) */ function sort_pitch(s) { - function pitch_compare(n1, n2) { - return n1.pit - n2.pit - } - - s.notes = s.notes.sort(pitch_compare) + s.notes = s.notes.sort(function(n1, n2) { + return n1.pit - n2.pit + }) } function new_note(grace, tp_fact) { var note, s, in_chord, c, dcn, type, @@ -14062,14 +13919,11 @@ function new_note(grace, tp_fact) { s = { type: NOTE, ctx: parse.ctx, -//temporary -// istart: parse.istart, stem: 0, multi: 0, nhd: 0, xmx: 0 } -//temporary s.istart = parse.bol + line.index if (curvoice.color) @@ -14093,10 +13947,7 @@ function new_note(grace, tp_fact) { case 'Z': s.type = MREST; c = line.next_char() - if (c > '0' && c <= '9') - s.nmes = line.get_int() - else - s.nmes = 1; + s.nmes = (c > '0' && c <= '9') ? line.get_int() : 1; s.dur = curvoice.wmeasure * s.nmes // ignore if in second voice @@ -14169,7 +14020,7 @@ function new_note(grace, tp_fact) { c = line.next_char() if (!c || c == '%') { syntax(1, "No end of decoration") - return null + return //null } if (c == '!') break @@ -14187,7 +14038,7 @@ function new_note(grace, tp_fact) { (s.grace || curvoice.ulen < 0) ? BASE_LEN / 4 : curvoice.ulen) if (!note) - return null + return //null // transpose if (curvoice.octave) @@ -14260,7 +14111,7 @@ function new_note(grace, tp_fact) { } if (s.grace && s.type != NOTE) { syntax(1, "Not a note in grace note sequence") - return null + return //null } if (s.notes) { // if note or rest @@ -14371,18 +14222,17 @@ function new_note(grace, tp_fact) { if (cfmt.shiftunison) s.shiftunison = cfmt.shiftunison - if (!curvoice.lyric_restart && !s.grace) - curvoice.lyric_restart = s - -// if (curvoice.clef.clef_type == 'p') -// s.perc = true + if (!grace) { + if (!curvoice.lyric_restart) + curvoice.lyric_restart = s + if (!curvoice.sym_restart) + curvoice.sym_restart = s + } if (a_dcn_sav) deco_cnv(a_dcn_sav, s, s.prev) if (parse.stemless) s.stemless = true -//temporary -// s.iend = parse.iend s.iend = parse.bol + line.index return s } @@ -14428,7 +14278,7 @@ var char_tb = [ ] function parse_music_line() { - var s, grace, sappo, dcn, i, c, idx, type, n, text, + var s, grace, sappo, dcn, i, c, idx, type, n, text, k, last_note_sav, a_dcn_sav, no_eol, tp_a = [], tp, tpn = -1, @@ -14480,11 +14330,13 @@ function parse_music_line() { // play the macro game for (k in mac) { - if (mac.hasOwnProperty(k)) + if (!mac.hasOwnProperty(k) + || line.buffer.indexOf(k[0]) < 0) + continue if (k.indexOf('.') >= 0) // dynamic line.buffer = expand(line.buffer, k) - else - line.buffer = line.buffer.replace(k, mac[k]) + else if (line.buffer.indexOf(k) >= 0) + line.buffer = line.buffer.replace(new RegExp(k, 'g'), mac[k]) } while (1) { @@ -14599,7 +14451,7 @@ function parse_music_line() { } } if (!s) { - syntax(1, "Bad character ')'") + syntax(1, "Bad character '$1'", c) break } if (s.slur_end) @@ -14784,7 +14636,6 @@ function parse_music_line() { grace = { type: GRACE, ctx: parse.ctx, -//temporary istart: parse.bol + line.index, dur: 0, multi: 0 @@ -14814,7 +14665,7 @@ function parse_music_line() { case '}': s = curvoice.last_note if (!grace || !s) { - syntax(1, "Bad character '}'") + syntax(1, "Bad character '$1'", c) break } if (a_dcn) @@ -14915,7 +14766,7 @@ function parse_music_line() { /* these are the widths for Times-Roman, extracted from the 'a2ps' package */ /*fixme-hack: set 500 to control characters for utf-8*/ -var cw_tb = [ +var cw_tb = new Float32Array([ .500,.500,.500,.500,.500,.500,.500,.500, // 00 .500,.500,.500,.500,.500,.500,.500,.500, .500,.500,.500,.500,.500,.500,.500,.500, // 10 @@ -14932,7 +14783,7 @@ var cw_tb = [ .500,.278,.278,.500,.278,.778,.500,.500, .500,.500,.333,.389,.278,.500,.500,.722, // 70 .500,.500,.444,.480,.200,.480,.541,.500 -] +]) /* -- return the character width -- */ function cwid(c) { @@ -15143,7 +14994,7 @@ function write_text(text, action) { var strlw = get_lwidth(), lineskip = gene.curfont.size * cfmt.lineskipfac, parskip = gene.curfont.size * cfmt.parskipfac, - i, j, x + i, j, x, words, w, k, ww switch (action) { default: // case 'c': @@ -15181,7 +15032,6 @@ function write_text(text, action) { break case 'f': case 'j': - var words j = 0 while (1) { i = text.indexOf('\n\n', j) @@ -15189,17 +15039,18 @@ function write_text(text, action) { words = text.slice(j) else words = text.slice(j, i); - words = words.split(/\s+/) - var w = 0, k = 0 + words = words.split(/\s+/); + w = k = 0 for (j = 0; j < words.length; j++) { - w += strw(words[j] + ' ') + ww = strw(words[j] + ' '); + w += ww if (w >= strlw) { vskip(lineskip); xy_str(0, 0, words.slice(k, j).join(' '), action, strlw); k = j; - w = 0 + w = ww } } if (w != 0) { @@ -15687,7 +15538,7 @@ function write_heading() { // generate a header/footer // (this function is not called from the core) // return an array of [left, center, right] texts -this.header_footer = function(str) { +Abc.prototype.header_footer = function(str) { var c, i, j = 0, r = ["", "", ""] @@ -15786,59 +15637,59 @@ var output = [], // output buffer // glyphs in music font var tgls = { - sgno: {x: -6, y:4, c:""}, - coda: {x:-12, y:6, c:""}, - tclef: {x:-8, y:0, c:""}, - cclef: {x:-8, y:0, c:""}, - bclef: {x:-8, y:0, c:""}, - pclef: {x:-6, y:0, c:""}, - stclef: {x:-8, y:0, c:""}, - scclef: {x:-8, y:0, c:""}, - sbclef: {x:-7, y:0, c:""}, - csig: {x:0, y:0, c:""}, - ctsig: {x:0, y:0, c:""}, - HDD: {x:-7, y:0, c:""}, - breve: {x:-6, y:0, c:""}, - HD: {x:-5.2, y:0, c:""}, - Hd: {x:-3.8, y:0, c:""}, - hd: {x:-3.7, y:0, c:""}, - srep: {x:-5, y:0, c:""}, - dot: {x:-2, y:0, c:""}, - "acc-1": {x:-3, y:0, c:""}, - acc3: {x:-2, y:0, c:""}, - acc1: {x:-3, y:0, c:""}, - acc2: {x:-3, y:0, c:""}, - pshhd: {x:-3, y:0, c:""}, - "acc-2": {x:-3, y:0, c:""}, - accent: {x:-3, y:0, c:""}, - marcato: {x:-3, y:0, c:""}, - hld: {x:-7, y:0, c:""}, - r00: {x:-1.5, y:0, c:""}, - r0: {x:-1.5, y:0, c:""}, - r1: {x:-3.5, y:6, c:""}, - r2: {x:-3.2, y:0, c:""}, - r4: {x:-3, y:0, c:""}, - r8: {x:-3, y:0, c:""}, - r16: {x:-4, y:0, c:""}, - r32: {x:-4, y:0, c:""}, - r64: {x:-4, y:0, c:""}, - r128: {x:-4, y:0, c:""}, - mrest: {x:-10, y:0, c:""}, - mrep: {x:-6, y:0, c:""}, - mrep2: {x:-9, y:0, c:""}, - turn: {x:-5, y:4, c:""}, - umrd: {x:-7, y:2, c:""}, - lmrd: {x:-7, y:2, c:""}, - ped: {x:-10, y:0, c:""}, - pedoff: {x:-5, y:0, c:""}, - longa: {x:-6, y:0, c:""} + sgno: {x: -6, y:4, c:"\ue047"}, + coda: {x:-12, y:6, c:"\ue048"}, + tclef: {x:-8, y:0, c:"\ue050"}, + cclef: {x:-8, y:0, c:"\ue05c"}, + bclef: {x:-8, y:0, c:"\ue062"}, + pclef: {x:-6, y:0, c:"\ue069"}, + stclef: {x:-8, y:0, c:"\ue07a"}, + scclef: {x:-8, y:0, c:"\ue07b"}, + sbclef: {x:-7, y:0, c:"\ue07c"}, + csig: {x:0, y:0, c:"\ue08a"}, + ctsig: {x:0, y:0, c:"\ue08b"}, + HDD: {x:-7, y:0, c:"\ue0a0"}, + breve: {x:-6, y:0, c:"\ue0a1"}, + HD: {x:-5.2, y:0, c:"\ue0a2"}, + Hd: {x:-3.8, y:0, c:"\ue0a3"}, + hd: {x:-3.7, y:0, c:"\ue0a4"}, + srep: {x:-5, y:0, c:"\ue101"}, + dot: {x:-2, y:0, c:"\ue1e7"}, + "acc-1": {x:-3, y:0, c:"\ue260"}, + acc3: {x:-2, y:0, c:"\ue261"}, + acc1: {x:-3, y:0, c:"\ue262"}, + acc2: {x:-3, y:0, c:"\ue263"}, + pshhd: {x:-3, y:0, c:"\ue263"}, + "acc-2": {x:-3, y:0, c:"\ue264"}, + accent: {x:-3, y:0, c:"\ue4a0"}, + marcato: {x:-3, y:0, c:"\ue4ac"}, + hld: {x:-7, y:0, c:"\ue4c0"}, + r00: {x:-1.5, y:0, c:"\ue4e1"}, + r0: {x:-1.5, y:0, c:"\ue4e2"}, + r1: {x:-3.5, y:6, c:"\ue4e3"}, + r2: {x:-3.2, y:0, c:"\ue4e4"}, + r4: {x:-3, y:0, c:"\ue4e5"}, + r8: {x:-3, y:0, c:"\ue4e6"}, + r16: {x:-4, y:0, c:"\ue4e7"}, + r32: {x:-4, y:0, c:"\ue4e8"}, + r64: {x:-4, y:0, c:"\ue4e9"}, + r128: {x:-4, y:0, c:"\ue4ea"}, + mrest: {x:-10, y:0, c:"\ue4ee"}, + mrep: {x:-6, y:0, c:"\ue500"}, + mrep2: {x:-9, y:0, c:"\ue501"}, + turn: {x:-5, y:4, c:"\ue567"}, + umrd: {x:-7, y:2, c:"\ue56c"}, + lmrd: {x:-7, y:2, c:"\ue56d"}, + ped: {x:-10, y:0, c:"\ue650"}, + pedoff: {x:-5, y:0, c:"\ue655"}, + longa: {x:-6, y:0, c:"\ue95c"} } // glyphs to put in var glyphs = { - brace: '', + brace: '\ue000', ghd: '\n\ - \n\ + \ue0a4\n\ ', acc1_1_4: '\n\ \n\ @@ -15851,7 +15702,7 @@ var glyphs = { M-3.7 -3.2l7.4 -2.2v2.2l-7.4 2.2v-2.2"/>\n\ ', "acc-1_1_4": '\n\ - \n\ + \ue260\n\ ', "acc-1_3_4": '\n\ \n\ ', turnx: '\n\ - \n\ + \ue567\n\ \n\ ', pfthd: '\n\ - \n\ + \ue263\n\ \n\ ', pmsig: '= 0) - new_scale = staff_tb[st].staffscale - else - new_scale = 1 + stv_g.scale = 0; + new_scale = st >= 0 ? staff_tb[st].staffscale : 1 if (st >= 0 && new_scale != 1) dy = staff_tb[st].y else @@ -16126,7 +15974,7 @@ function delayed_update() { (posy - staff_tb[st].y).toFixed(2) + ') scale(' + staff_tb[st].staffscale.toFixed(2) + - ')">\n') + ')">\n'); output.push(staff_tb[st].sc_out.join('')); output.push('\n'); staff_tb[st].sc_out = [] @@ -16160,16 +16008,9 @@ function anno_out(s, t, f) { if (s.grace) type = GRACE -//fixme: removed for bad x,y with %%voicescale -// if (stv_g.started) { // protection against end of container -// stv_g.started = false; -// output.push("\n") -// } - f(t || anno_type[type], s.istart, s.iend, s.x - wl - 2, staff_tb[s.st].y + s.ymn + h - 2, wl + wr + 4, h, s); -// set_g() } function a_start(s, t) { @@ -16178,10 +16019,10 @@ function a_start(s, t) { function a_stop(s, t) { anno_out(s, t, user.anno_stop) } -// These pointers are reset to empty functions at init time -// if no user.anno_{start,stop} (see abc2svg_init) -var anno_start = a_start, - anno_stop = a_stop +function empty_function() { +} +var anno_start = user.anno_start ? a_start : empty_function, + anno_stop = user.anno_stop ? a_stop : empty_function // output a string with x, y, a and b // In the string, @@ -16190,7 +16031,7 @@ var anno_start = a_start, // F and G are replaced by a and b as float function out_XYAB(str, x, y, a, b) { x = sx(x); - y = sy(y) + y = sy(y); output.push(str.replace(/X|Y|A|B|F|G/g, function(c) { switch (c) { case 'X': return x.toFixed(2) @@ -16518,6 +16359,11 @@ sfz: dx: 0, dy: 5, style: 'style="font:bold italic 14px serif"' + }, +'@': { + dx: 0, + dy: 5, + style: 'style="font:12px sans-serif"' } } @@ -16527,7 +16373,7 @@ function out_deco_str(x, y, name, str) { if (!a_deco) { error(1, null, 'no definition of $1', name); - a_deco = deco_str_style.fng + a_deco = deco_str_style['@'] } x += a_deco.dx; y += a_deco.dy; @@ -16690,7 +16536,7 @@ function out_gliss(x2, y2, de) { g_open(x1, y1, a); x1 = de1.s.dots ? 13 + de1.s.xmx : 8; - len -= x1 + 8 + len -= x1 + 8; xypath(x1, 0); output.push('l' + len.toFixed(2) + ' 0" stroke-width="1"/>\n'); g_close() @@ -16717,19 +16563,10 @@ function vskip(h) { // create the SVG image of the block function svg_flush() { -// var img_title, head var head if (multicol || output.length == 0 || !user.img_out || posy == 0) return -// if (info.X) { -// img_title = info.X + '.' -// if (info.T) -// img_title += ' ' + info.T.split('\n')[0] -// img_title = clean_txt(img_title) -// } else { -// img_title = 'noname' -// } posy *= cfmt.scale if (user.imagesize) { @@ -16739,14 +16576,12 @@ function svg_flush() { user.imagesize + ' viewBox="0 0 ' + cfmt.pagewidth.toFixed(0) + ' ' + posy.toFixed(0) + '">\n' -//abc2svg - ' + img_title + '\n' } else { head = '\n' -//abc2svg - ' + img_title + '\n' } if (style || font_style || musicfont) { @@ -16768,11 +16603,9 @@ function svg_flush() { head += '\n'; - if (typeof svgobj == 'object') { // if PostScript support - svgobj.setg(0); - output.push(svgbuf); - svgbuf = '' - } + if (psvg) // if PostScript support + psvg.ps_flush(true); // + setg(0) + user.img_out(head + output.join('') + "\n"); output = [] @@ -16842,7 +16675,7 @@ var par_sy, // current staff system for parse /* apply the %%voice options of the current voice */ function voice_filter() { - var opt, sel, tmp, i + var opt, sel, i for (opt in parse.voice_opts) { if (!parse.voice_opts.hasOwnProperty(opt)) @@ -17117,7 +16950,7 @@ function sort_all() { // adjust some voice elements function voice_adj() { - var p_voice, s, s2, s3, v + var p_voice, s, s2, v // set the duration of the notes under a feathered beam function set_feathered_beam(s1) { @@ -17167,14 +17000,17 @@ function voice_adj() { if (s && staves_found <= 0) { // && !s.del) { - play problem v = par_sy.top_voice; p_voice = voice_tb[v]; - s.v = v; - s.p_v = p_voice; - s.st = p_voice.st; - s.time = 0; - s.next = p_voice.sym - if (s.next) - s.next.prev = s; - p_voice.sym = s + if (p_voice.sym && p_voice.sym.type != TEMPO) { + s = clone(s); + s.v = v; + s.p_v = p_voice; + s.st = p_voice.st; + s.time = 0; + s.next = p_voice.sym + if (s.next) + s.next.prev = s; + p_voice.sym = s + } } for (v = 0; v < voice_tb.length; v++) { @@ -17187,33 +17023,6 @@ function voice_adj() { } for ( ; s; s = s.next) { switch (s.type) { -// case CLEF: // move the clefs before the measure bars -// for (s2 = s.prev; s2; s2 = s2.prev) { -// switch (s2.type) { -// case BAR: -// if (s2.time != s.time) -// break -// -// /* move the clef */ -// s.next.prev = s.prev; -// s.prev.next = s.next; -// s.next = s2; -// s.prev = s2.prev; -// s.prev.next = s; -// s2.prev = s -// break -// case MREST: -// case NOTE: -// case REST: -// case SPACE: -// case STBRK: -// break -// default: -// continue -// } -// break -// } -// continue case GRACE: // with w_tb[BAR] = 2, // the grace notes go after the bar; @@ -17350,7 +17159,6 @@ function go_global_time(s, symsel) { var s2, bar_time, seq if (symsel.bar <= 1) { /* special case: there is no measure 0/1 */ -// && nbar == -1) { /* see set_bar_num */ if (symsel.bar == 1) { for (s2 = s; s2; s2 = s2.ts_next) { if (s2.type == BAR @@ -17367,7 +17175,7 @@ function go_global_time(s, symsel) { break } if (!s) - return null + return // null if (symsel.seq != 0) { seq = symsel.seq for (s = s.ts_next; s; s = s.ts_next) { @@ -17378,7 +17186,7 @@ function go_global_time(s, symsel) { } } if (!s) - return null + return // null } } @@ -17472,7 +17280,7 @@ function do_clip() { /* -- set the bar numbers and treat %%clip / %%break -- */ function set_bar_num() { - var s, s2, s3, tim, + var s, s2, tim, v = cur_sy.top_voice, wmeasure = voice_tb[v].meter.wmeasure, bar_rep = gene.nbar @@ -17534,51 +17342,11 @@ function set_bar_num() { } // set the measure number on the top bars -// // and move the clefs before the measure bars var bar_time = s.time + wmeasure, // for incomplete measure at start of tune bar_num = gene.nbar for ( ; s; s = s.ts_next) { switch (s.type) { -// case CLEF: -// for (s2 = s.ts_prev; s2; s2 = s2.ts_prev) { -// switch (s2.type) { -// case BAR: -// if (s2.seqst) -// break -// continue -// case MREST: -// case NOTE: -// case REST: -// case SPACE: -// case STAVES: -// case STBRK: -// s2 = undefined -// break -// default: -// continue -// } -// break -// } -// if (!s2) -// break -// -// /* move the clef */ -// s.next.prev = s.prev; -// s.prev.next = s.next; -// s.ts_next.ts_prev = s.ts_prev; -// s.ts_prev.ts_next = s.ts_next; -// s.next = s2; -// s.prev = s2.prev; -// if s.prev) -// s.prev.next = s; -// s2.prev = s; -// s.ts_next = s2; -// s.ts_prev = s2.ts_prev; -// s.ts_prev.ts_next = s; -// s2.ts_prev = s -// s = s2 -// break case METER: wmeasure = s.wmeasure if (s.time < bar_time) @@ -17786,8 +17554,6 @@ function get_midi(param) { function set_transp() { var s, transp, vtransp -// if (curvoice.clef.clef_type == "p") // percussion -// return if (curvoice.ckey.k_bagpipe || curvoice.ckey.k_drum) return @@ -17823,11 +17589,6 @@ function set_transp() { } s = s.prev } -// s.k_sf = curvoice.okey.k_sf -// if (curvoice.okey.k_none) -// s.k_none = curvoice.okey.k_none -// if (curvoice.okey.k_a_acc) -// s.k_a_acc = curvoice.okey.k_a_acc; key_transp(s); curvoice.ckey = clone(s) if (curvoice.key.k_none) @@ -18023,7 +17784,7 @@ function do_pscom(text) { return case "repeat": if (parse.state != 3) - return + return if (!curvoice.last_sym) { syntax(1, "%%repeat cannot start a tune") return @@ -18279,10 +18040,8 @@ function do_begin_end(type, switch (type) { default: // case "ps": - if (typeof wpsobj == 'object') { - wpsobj.parse(text); - output.push(svgbuf) - } + if (psvg) + psvg.ps_eval(text) break case "js": eval(text) @@ -18446,14 +18205,6 @@ function acc_same_pitch(pitch) { var i, time, s = curvoice.last_sym.prev - // the overlaid voices may have no measure bars -// if (curvoice.id[curvoice.id.length - 1] == 'o') { -// for (i = curvoice.v; --i > 0; ) -// if (!voice_tb[i].second) -// break -// s = voice_tb[i].last_sym -// } - if (!s) return //undefined; @@ -18563,7 +18314,6 @@ function get_staves(cmd, parm) { s.sy = par_sy } -// staves_found = maxtime < 0 ? 0 : maxtime staves_found = maxtime /* initialize the (old) voices */ @@ -18572,7 +18322,6 @@ function get_staves(cmd, parm) { delete p_voice.second delete p_voice.ignore delete p_voice.floating -// p_voice.time = maxtime } range = 0 for (i = 0; i < a_vf.length; i++) { @@ -18699,18 +18448,13 @@ function get_staves(cmd, parm) { continue } par_sy.voices[v].second = p_voice.second; -// par_sy.voices[v].clef = p_voice.clef; st = p_voice.st if (st > 0 && !p_voice.norepbra && !(par_sy.staves[st - 1].flags & STOP_BAR)) p_voice.norepbra = true -// par_sy.staves[st].clef = p_voice.clef } - if (parse.state >= 2) - curvoice = voice_tb[par_sy.top_voice] - else - curvoice = null + curvoice = parse.state >= 2 ? voice_tb[par_sy.top_voice] : null } var err_no_strt_ov = "No note in voice overlay" @@ -18734,11 +18478,14 @@ function get_vover(type) { p_voice.id = id; p_voice.sym = p_voice.last_sym = null; - p_voice.nm = null; - p_voice.snm = null; - p_voice.new_name = false; - p_voice.lyric_restart = p_voice.lyric_restart = - p_voice.lyric_cont = p_voice.ly_a_h = null; + delete p_voice.nm + delete p_voice.snm + delete p_voice.new_name + delete p_voice.lyric_restart + delete p_voice.lyric_cont + delete p_voice.ly_a_h; + delete p_voice.sym_restart + delete p_voice.sym_cont voice_tb.push(p_voice) return p_voice @@ -18783,25 +18530,17 @@ function get_vover(type) { syntax(1, err_no_strt_ov) return } -//--fixme? -// curvoice.last_sym.beam_end = true curvoice.last_note.beam_end = true; p_voice2 = curvoice.voice_down if (!p_voice2) { p_voice2 = clone_voice(curvoice.id + 'o'); -// p_voice2.voice_up = curvoice; curvoice.voice_down = p_voice2; p_voice2.time = 0; p_voice2.second = true; v2 = p_voice2.v; par_sy.voices[v2] = { st: curvoice.st, - second: true, - scale: curvoice.scale, - key: curvoice.key, - ckey: curvoice.ckey, - okey: curvoice.okey, - pos: p_voice2.pos + second: true } var f_clone = curvoice.clone != undefined ? 1 : 0; range = par_sy.voices[curvoice.v].range @@ -18816,29 +18555,15 @@ function get_vover(type) { v3 = p_voice3.v; par_sy.voices[v3] = { second: true, - scale: curvoice.clone.scale, range: range + 2 } p_voice2.clone = p_voice3 } } -//--fixme: in abcparse.c curvoice ulen and microscale are forced here p_voice2.ulen = curvoice.ulen p_voice2.dur_fact = curvoice.dur_fact if (curvoice.uscale) p_voice2.uscale = curvoice.uscale -//--fixme:, but not the scale, pos... - -// v = curvoice.v -// v2 = p_voice2.v -// p_voice2.cst = p_voice2.st = par_sy.voices[v2].st -// = par_sy.voices[v].st -// p_voice3 = p_voice2.clone -// if (p_voice3) { -// p_voice3.cst = p_voice3.st -// = par_sy.voices[p_voice3.v].st -// = par_sy.voices[curvoice.clone.v].st -// } if (!vover) { /* first '&' in a measure */ vover = { @@ -18943,8 +18668,6 @@ function get_key(parm) { p_voice.key = s_key; p_voice.okey = clone(s_key); p_voice.ckey = clone(s_key) -// if (s_key.k_none) -// p_voice.key.k_sf = 0 } parse.okey = clone(s_key); parse.ckey = s_key @@ -18987,12 +18710,9 @@ function get_key(parm) { curvoice.ckey = s_key if (is_voice_sig()) { -// if (s_key.k_sf != undefined || s_key.k_a_acc) { -// curvoice.ckey = s_key; - curvoice.key = clone(s_key) - if (s_key.k_none) - curvoice.key.k_sf = 0 -// } + curvoice.key = clone(s_key) + if (s_key.k_none) + curvoice.key.k_sf = 0 return } @@ -19106,6 +18826,10 @@ function get_voice(parm) { return } + if (vid == '*') { + syntax(1, "Cannot have V:* in tune body") + return + } curvoice = new_voice(vid); set_kv_parm(a) if (parse.state == 2) // if first voice @@ -19145,7 +18869,7 @@ function get_voice(parm) { // change state from 'tune header after K:' to 'in tune body' // curvoice is defined when called from get_voice() function goto_tune(is_K) { - var v, p_voice, transp, + var v, p_voice, s = { type: STAVES, dur: 0, @@ -19180,8 +18904,6 @@ function goto_tune(is_K) { p_voice.pos = clone(p_voice.pos); p_voice.pos.stm = SL_BELOW } -// if (p_voice.key.k_none) -// p_voice.key.k_sf = 0 } // initialize the voices when no %%staves/score @@ -19190,7 +18912,7 @@ function goto_tune(is_K) { for (v = 0; v <= nstaff; v++) { p_voice = voice_tb[v]; p_voice.time = 0; // old voice - p_voice.clef.time = 0 + p_voice.clef.time = 0; p_voice.st = p_voice.cst = par_sy.voices[v].st = par_sy.voices[v].range = v; @@ -19229,6 +18951,110 @@ function goto_tune(is_K) { // You should have received a copy of the GNU Lesser General Public License // along with abc2svg-core. If not, see . +// parse a symbol line (s:) +function get_sym(p, cont) { + var s, c, i, j, d + + if (curvoice.ignore) + return + + // get the starting symbol of the lyrics + if (cont) { // +: + s = curvoice.sym_cont + if (!s) { + syntax(1, "+: symbol line without music") + return + } + } else { + if (curvoice.sym_restart) { // new music + curvoice.sym_start = s = curvoice.sym_restart; + curvoice.sym_restart = null + } else { + s = curvoice.sym_start + } + if (!s) + s = curvoice.sym + if (!s) { + syntax(1, "s: without music") + return + } + } + + /* scan the symbol line */ + i = 0 + while (1) { + while (p[i] == ' ' || p[i] == '\t') + i++; + c = p[i] + if (!c) + break + switch (c) { + case '|': + while (s && s.type != BAR) + s = s.next + if (!s) { + syntax(1, "Not enough measure bars for symbol line") + return + } + s = s.next; + i++ + continue + case '!': + case '"': + j = ++i + i = p.indexOf(c, j) + if (i < 0) { + syntax(1, c == '!' ? + "No end of decoration" : + "No end of guitar chord"); + i = p.length + continue + } + d = p.slice(j - 1, i + 1) + break + case '*': + break + default: + d = c.charCodeAt(0) + if (d < 128) { + d = char_tb[d] + if (d.length > 1 + && (d[0] == '!' || d[0] == '"')) { + c = d[0] + break + } + } + syntax(1, "Bad character '$1'", c) + break + } + + /* store the element in the next note */ + while (s && (s.type != NOTE || s.grace)) + s = s.next + if (!s) { + syntax(1, "Too many elements in symbol line") + return + } + switch (c) { + default: +// case '*': + break + case '!': + deco_cnv([d.slice(1, -1)], s, s.prev) + break + case '"': + a_gch = s.a_gch; + parse_gchord(d) + if (a_gch) + gch_build(s) + break + } + s = s.next; + i++ + } + curvoice.lyric_cont = s +} + /* -- parse a lyric (vocal) line (w:) -- */ function get_lyrics(text, cont) { var s, word, p, i, j, ly @@ -19824,9 +19650,6 @@ function parse_gchord(type) { if (curvoice.pos.gch == SL_HIDDEN) return - if (!a_gch) - a_gch = [] - i = 0; type = 'g' while (1) { @@ -19905,6 +19728,8 @@ function parse_gchord(type) { i++ break } + if (!a_gch) + a_gch = [] a_gch.push(gch) } } @@ -19997,7 +19822,6 @@ function gch_transp(s) { i3 = cde2fcg[n] + i2 + a * 7; i4 = cgd2cde[(i3 + 16 * 7) % 7]; // note i1 = ((((i3 + 22) / 7) | 0) + 159) % 5 // accidental -// = ((((i3 + 1 + 21) / 7) | 0) + 2 - 3 + 32 * 5) % 5 if (latin == 0) new_txt = note_names[i4] + acc_name[i1] else @@ -20312,9 +20136,6 @@ function draw_gchord(s, gchy_min, gchy_max) { if (y2 < staff_tb[s.st].ann_bot) staff_tb[s.st].ann_bot = y2 } -// y_set(s.st, 1, x, 1, y + h * .8 + 3) -// else -// y_set(s.st, 0, x, 1, y - h * .2) break } y *= staff_tb[s.st].staffscale @@ -20332,7 +20153,7 @@ function draw_gchord(s, gchy_min, gchy_max) { } // abc2svg - tail.js // -// Copyright (C) 2014-2015 Jean-Francois Moine +// Copyright (C) 2014-2017 Jean-Francois Moine // // This file is part of abc2svg-core. // @@ -20349,15 +20170,72 @@ function draw_gchord(s, gchy_min, gchy_max) { // You should have received a copy of the GNU Lesser General Public License // along with abc2svg-core. If not, see . -// end of the Abc object -// empty ps functions - function psdeco(f, x, y, de) { return false } - function psxygl(x, y, gl) { return false } + var psdeco = function(f, x, y, de) { return false }, + psxygl = function(x, y, gl) { return false } + +// try to install PostScript support +function ps_def(abcobj) { + if (psvg || typeof Psvg != "function") + return // already installed or no support + +// ---- Abc functions called from the PS interpreter + function svgcall(f, x, y, v1, v2) { + var xy = psvg.getorig(); + psvg.ps_flush(); + f((x + xy[0]) * stv_g.scale, y - xy[1], v1, v2) + } + + // output an arpeggio + Abc.prototype.arpps = function(val, x, y) { + svgcall(out_arp, x, y, val) + } + + // output a long trill + Abc.prototype.ltrps = function(val, x, y) { + svgcall(out_ltr, x, y, val) + } + + // output a deco with string + Abc.prototype.xyglsps = function(str, x, y, gl) { + svgcall(out_deco_str, x, y, gl, str) + } + + // output a deco with value + Abc.prototype.xyglvps = function(val, x, y, gl) { + svgcall(out_deco_val, x, y, gl, val) + } + + // output a glyph + Abc.prototype.xyglps = function(x, y, gl) { + svgcall(xygl, x, y, gl) + } + + Abc.prototype.get_y = function(st, y) { + return y + staff_tb[st].y + } + + Abc.prototype.set_ps = function(deco, xygl) { + psdeco = deco; + psxygl = xygl + } + Abc.prototype.stv_g = stv_g + Abc.prototype.psget_x = function() { + return posx / stv_g.scale + } + Abc.prototype.psget_y = function() { + return stv_g.started ? stv_g.dy : posy + } + + psvg = new Psvg(abcobj) +} + + Abc.prototype.ps_def = ps_def; // initialize - abc2svg_init() + ps_def(this); + font_init(); + init_tune() - return this } // end of Abc() // nodejs @@ -20367,7 +20245,7 @@ if (typeof module == 'object' && typeof exports == 'object') { } //#javascript // abc2svg - ABC to SVG translator -// @source: http://moinejf.free.fr/js/abc2svg.tar.gz.php +// @source: https://github.com/moinejf/abc2svg.git // Copyright (C) 2014-2017 Jean-Francois Moine // // This file is part of abc2svg-core. @@ -20384,7 +20262,7 @@ if (typeof module == 'object' && typeof exports == 'object') { // // You should have received a copy of the GNU Lesser General Public License // along with abc2svg-core. If not, see . -// json-1.js for abc2svg-1.13.7-2-g2e5cbb2 (2017-08-17) +// json-1.js for abc2svg-1.14.1-1-gb9d3cab (2017-09-13) //#javascript // Generate a JSON representation of ABC // @@ -20415,7 +20293,7 @@ if (typeof module == 'object' && typeof exports == 'object') { function AbcJSON(nindent) { // indentation level var inb = Array((nindent || 2) + 1).join(' ') // indentation base - this.gen_json = function (tsfirst, voice_tb, anno_type, info) { + AbcJSON.prototype.gen_json = function (tsfirst, voice_tb, anno_type, info) { var json, i, j, l, v, s, h, ind2 = inb + inb, ind3 = ind2 + inb, @@ -20531,7 +20409,7 @@ function AbcJSON(nindent) { // indentation level } //#javascript // abc2svg - ABC to SVG translator -// @source: http://moinejf.free.fr/js/abc2svg.tar.gz.php +// @source: https://github.com/moinejf/abc2svg.git // Copyright (C) 2014-2017 Jean-Francois Moine // // This file is part of abc2svg-core. @@ -20548,7 +20426,7 @@ function AbcJSON(nindent) { // indentation level // // You should have received a copy of the GNU Lesser General Public License // along with abc2svg-core. If not, see . -// midi-1.js for abc2svg-1.13.7-2-g2e5cbb2 (2017-08-17) +// midi-1.js for abc2svg-1.14.1-1-gb9d3cab (2017-09-13) //#javascript // Set the MIDI pitches in the notes // @@ -20598,15 +20476,20 @@ function AbcMIDI() { NOTE = 8 // add MIDI pitches - this.add = function(s, // starting symbol - voice_tb) { // voice table - - var scale = [0, 2, 4, 5, 7, 9, 11], // note to pitch - bmap = [], // measure base map - map = [], // current map - 10 octaves - i, n, pit, lrep, g, v, - rep_en_map = [], - transp = [] // transposition per voice + AbcMIDI.prototype.add = function(s, // starting symbol + voice_tb) { // voice table + + var scale = new Int8Array( // note to pitch + [0, 2, 4, 5, 7, 9, 11]), + bmap = new Int8Array(7), // measure base map + map = new Int8Array(70), // current map - 10 octaves + i, n, g, v, p, a, + tie_map = [], // index = MIDI pitch + tie_time= [], + rep_tie_map = [], + rep_tie_time = [], + transp = [], // transposition per voice + note // re-initialize the map on bar function bar_map() { @@ -20639,45 +20522,12 @@ function AbcMIDI() { } // key_map() // convert ABC pitch to MIDI - function pit2midi(s, i) { - var p = s.notes[i].apit + 19, // pitch from lowest C - a = s.notes[i].acc - - if (transp[s.v]) - p += transp[s.v] - if (a) - map[p] = a == 3 ? 0 : a; // (3 = natural) - return ((p / 7) | 0) * 12 + scale[p % 7] + map[p] + function pit2midi(p, a) { + if (a) + map[p] = a == 3 ? 0 : a; // (3 = natural) + return ((p / 7) | 0) * 12 + scale[p % 7] + map[p] } // pit2midi() - // handle the ties - function do_tie(s, i) { - var j, n, s2, note2, pit, str_tie, - note = s.notes[i], - tie = note.ti1, - end_time - - pit = note.apit; // absolute pitch - end_time = s.time + s.dur - for (s2 = s.next; ; s2 = s2.next) { - if (!s2 - || s2.time != end_time) - return - if (s2.type == NOTE) - break - } - n = s2.notes.length - for (j = 0; j < n; j++) { - note2 = s2.notes[j] - if (note2.apit == pit) { - note2.midi = note.midi - if (note2.ti1) - do_tie(s2, j) - break - } - } - } // do_tie() - // initialize the clefs and keys for (v = 0; v < voice_tb.length; v++) { n = voice_tb[v].clef @@ -20688,7 +20538,6 @@ function AbcMIDI() { transp[v] = n.clef_octave } key_map(voice_tb[0].key); // init acc. map from key sig. - lrep = false while (s) { switch (s.type) { @@ -20696,28 +20545,26 @@ function AbcMIDI() { //fixme: handle different keys per staff if (s.st != 0) break -//fixme: handle the ties on repeat - // left repeat - if (s.bar_type[s.bar_type.length - 1] == ':') { - lrep = false - - // 1st time repeat - } else if (s.text && s.text[0] == '1') { - lrep = true; - bar_map() - for (i = 0; i < 7; i++) - rep_en_map[i] = bmap[i] - break - - // right repeat - } else if (s.bar_type[0] == ':') { - if (lrep) { - for (i = 0; i < 7; i++) - bmap[i] = rep_en_map[i] + // x times repeat + if (s.text) { + if (s.text[0] == '1') { // 1st time + rep_tie_map = []; + rep_tie_time = [] + for (i in tie_map) { + rep_tie_map[i] = tie_map[i]; + rep_tie_time[i] = tie_time[i] + } + } else if (rep_tie_map.length != 0) { + tie_map = [] + tie_time = [] + for (i in rep_tie_map) { + tie_map[i] = rep_tie_map[i]; + tie_time[i] = rep_tie_time[i] + } } } - - bar_map() + if (!s.invis) + bar_map() break case CLEF: if (!s.clef_octave @@ -20732,11 +20579,11 @@ function AbcMIDI() { if (!g.type != NOTE) continue for (i = 0; i <= g.nhd; i++) { - if (g.notes[i].midi != undefined) - continue - pit = g.notes[i].apit; - str_tie = '_' + g.st + pit; - g.notes[i].midi = pit2midi(g, i) + note = g.notes[i]; + p = note.apit + 19 + if (transp[s.v]) + p += transp[s.v]; + note.midi = pit2midi(p, note.acc) } } break @@ -20748,13 +20595,24 @@ function AbcMIDI() { break case NOTE: for (i = 0; i <= s.nhd; i++) { - if (s.notes[i].midi != undefined) - continue - pit = s.notes[i].apit; - str_tie = '_' + s.st + pit; - s.notes[i].midi = pit2midi(s, i) - if (s.notes[i].ti1) - do_tie(s, i) + note = s.notes[i]; + p = note.apit + 19 // pitch from C-1 + if (transp[s.v]) + p += transp[s.v] + if (tie_map[p]) { + if (s.time > tie_time[p]) { + delete tie_map[p] + delete tie_time[p] + } else { + map[p] = tie_map[p] + } + } + note.midi = pit2midi(p, note.acc) + if (note.ti1) { + if (note.acc) + tie_map[p] = map[p]; + tie_time[p] = s.time + s.dur + } } break } diff --git a/30_sources/UD_Zupfnoter-Handbuch/000_UD-Zupfnoter-Version.md b/30_sources/UD_Zupfnoter-Handbuch/000_UD-Zupfnoter-Version.md index 3c3a9132..8ee26c0b 100644 --- a/30_sources/UD_Zupfnoter-Handbuch/000_UD-Zupfnoter-Version.md +++ b/30_sources/UD_Zupfnoter-Handbuch/000_UD-Zupfnoter-Version.md @@ -1,5 +1,5 @@ -Version 1.7.0 +Version 1.8.0 dev 1 © 2017 https://www.zupfnoter.de diff --git a/30_sources/UD_Zupfnoter-Handbuch/010_UD-Zupfnoter-Frontmatter.md b/30_sources/UD_Zupfnoter-Handbuch/010_UD-Zupfnoter-Frontmatter.md index eb876dba..72e57262 100644 --- a/30_sources/UD_Zupfnoter-Handbuch/010_UD-Zupfnoter-Frontmatter.md +++ b/30_sources/UD_Zupfnoter-Handbuch/010_UD-Zupfnoter-Frontmatter.md @@ -25,7 +25,7 @@ hat. Aber wie sagt man doch so schön: "keine Panik!". Ersteller einfacher Unterlegnoten kommen mit den ersten Kapiteln schon auf die Erfolgsstraße. -Dieses Handbuch richtet sich an alle, die Zupfnoter vewenden und sich +Dieses Handbuch richtet sich an alle, die Zupfnoter verwenden und sich selbst in den Zupfnoter einarbeiten wollen. Dabei haben wir folgende Zielgruppen im Blick: @@ -42,15 +42,15 @@ Zielgruppen im Blick: Phantasie begrenzt. - **Lektoren** schreiben nicht selbst im Zupfnoter, sondern redigieren - Noten in Zpufnoter. + Noten in Zupfnoter. Dieses Handbuch wurde von Verena Hinzmann und Bernhard Weichel erstellt. > **Hinweis**: Dieses Handbuch ist noch nicht fertig; Kapitel 5 ff. sind -> nur rudimentär. Wir veröffentlichen daher die Voreabversionen mit -> TODOs und Zeilennummern. +> nur rudimentär. Wir veröffentlichen daher die Vorabversionen mit TODOs +> und Zeilennummern. > -> Für Hinweise auf Fehler oder Verbessrungsmöglichkeiten sind wir sehr +> Für Hinweise auf Fehler oder Verbesserungsmöglichkeiten sind wir sehr > dankbar. TODO: markieren, für welche Zielgruppe welche Textabschnitte relevant diff --git a/30_sources/UD_Zupfnoter-Handbuch/030_UD_Zupfnoter-erste-schritte.md b/30_sources/UD_Zupfnoter-Handbuch/030_UD_Zupfnoter-erste-schritte.md index 5bc39255..cdfee059 100644 --- a/30_sources/UD_Zupfnoter-Handbuch/030_UD_Zupfnoter-erste-schritte.md +++ b/30_sources/UD_Zupfnoter-Handbuch/030_UD_Zupfnoter-erste-schritte.md @@ -2,7 +2,7 @@ Mit dem Zupfnoter kannst du ganz schnell einfache Musikstücke eingeben und als Unterlegnoten darstellen. Mit der Zeit wirst du immer mehr -Funktionen und Möglichkeiten von Zufnoter erobern, um auch komplexe +Funktionen und Möglichkeiten von Zupfnoter erobern, um auch komplexe Musikstücke zu bearbeiten bzw. die Unterlegnoten im Detail nach deinen Wünschen zu gestalten. @@ -150,7 +150,7 @@ Beispiel kannst du zunächst einen Liedtext hinzufügen: \needspace{6cm} - > **Hinseis:** Leerzeichen in den Liedtexten werden komprimiert, + > **Hinweis:** Leerzeichen in den Liedtexten werden komprimiert, > d.h. zu einem Leerzeichen zusammengefasst. Leerzeichen am Anfang > einer Zeile (führende Leerzeichen) werden ignoriert. Du kannst > aber die Ausgabe eines Leerzeichens erzwingen, wenn du die Tilde @@ -259,7 +259,7 @@ Da du aber nicht nur ein Musikstück schreiben willst, solltest du natürlich dein Musikstück auf deinem Rechner so abspeichern, dass du es später wieder laden und weiter bearbeiten kannst. -Zupfnoter bietet dazu zuwei Möglichkeiten: +Zupfnoter bietet dazu zwei Möglichkeiten: - Speichern per Download: Das läuft vollkommen lokal, ist aber nicht sehr komfortabel @@ -302,7 +302,7 @@ diese weiter zu geben): Wenn du regelmäßig mit Zupfnoter arbeiten willst, bietet es sich an, zum Speichern der Muskstücke die Dropbox zu benutzen. Eine Dropbox ist ein Speicher außerhalb deines Rechners (in der "Cloud"). Mit der Dropbox -hast du viele Vorteile bei Zupfbnoter: +hast du viele Vorteile bei Zupfnoter: - Zupfnoter speichert abc, pdf und Noten eines Musikstücks mit nur einem Klick @@ -335,7 +335,7 @@ verwendetem Browser** mit diesem Dropbox-Konto verbinden: - klicke auf Schaltfläche "Einloggen" bzw. wähle das Menü "Dropbox \> Einloggen" - es erscheint der Zupfnoter - Dialog "Einloggen" - gib dort bitte ein - Verezeichnis aus deiner Dropbox ein, in welcher du dein Musikstück + Verzeichnis aus deiner Dropbox ein, in welcher du dein Musikstück speichern möchtest > > > ![](../ZAUX_Images/030-041_Dropbox-step-01.jpg)  @@ -364,7 +364,7 @@ verwendetem Browser** mit diesem Dropbox-Konto verbinden: "Dropbox \> Speichern" )um dein Musikstück und die Auszüge als PDF-Dateien in deiner Dropbox zu speichern. - > **HInweis**: Zupfnoter speichert in dem Verzeichnis, welches beim + > **Hinweis**: Zupfnoter speichert in dem Verzeichnis, welches beim > Einloggen angegeben wurde. Fall das Verzeichnis nicht existiert, > wird es angelegt. Bitte achte auf also die richtige Schreibweise @@ -387,7 +387,7 @@ Zupfnoter verwendet jedoch nur folgende Dateitypen in deiner Dropbox: > "inkognito - Modus" des Browsers zu arbeiten. > > - Dropbox-Anwendungen speichern ein geheime Zeichenkette (auch -> "Accesstoken" genannt) auf deineme lokalen Rechner. Wenn du +> "Accesstoken" genannt) auf deinem lokalen Rechner. Wenn du > vermutest, das dieses Token kompromittiert wurde, kannst du auf > der Website von Dropbox die Verbindung zu Zupfnoter löschen. > Dadurch wird bei der nächsten Anmeldung ein neues Token erzeugt. @@ -409,7 +409,7 @@ Zupfnoter verwendet jedoch nur folgende Dateitypen in deiner Dropbox: ## Musikstück aus Dropbox laden Um das Musikstück wieder zu laden, klicke auf "Öffnen" bzw. wähle das -Menü "Dropbox \> Öfnnen". Es erscheint ein Datei-Auswahl-Dialog von +Menü "Dropbox \> Öffnen". Es erscheint ein Datei-Auswahl-Dialog von Dropbox. Dort ist oben ein Suchfeld. Dort kannst du einen Teil des Dateinamens eingeben, um die gewünschte Datei zu suchen. @@ -459,11 +459,11 @@ Musikstück für die Tischharfe anzupassen. > Musikstück speichern soll. [^030_UD_Zupfnoter-erste-schritte.md_1]: man mag sich fragen, warum - Zupfnoter nicht einen Standard-Liedbock eingebaut hat. Ein solcher - Standard-Liedbock schlägt aber immer wieder durch und macht die + Zupfnoter nicht einen Standard-Liedblock eingebaut hat. Ein solcher + Standard-Liedblock schlägt aber immer wieder durch und macht die inidividuelle Anordnung von Strophen sehr komplex, da man nicht nur die Strophen hinzufügen, sondern auch die Wirkung des - Stnadard-Liedbocks neutralisieren muss. + Standard-Liedblocks neutralisieren muss. [^030_UD_Zupfnoter-erste-schritte.md_2]: Für diese Funktion muss der "Dropbox client" installiert sein. diff --git a/30_sources/UD_Zupfnoter-Handbuch/040_UD-Zupfnoter-Referenz.md b/30_sources/UD_Zupfnoter-Handbuch/040_UD-Zupfnoter-Referenz.md index 51a85707..7e6d122b 100644 --- a/30_sources/UD_Zupfnoter-Handbuch/040_UD-Zupfnoter-Referenz.md +++ b/30_sources/UD_Zupfnoter-Handbuch/040_UD-Zupfnoter-Referenz.md @@ -43,13 +43,13 @@ ABC-Notation: Kapitel \ref{masken-fuer-zusaetze} [Zusätze](#masken-fuer-zusaetze)). - **Konfiguration** der Unterlegnoten: Zupfnoter gewinnt seine - Leistungsfähigkit und \index{Konfiguration} Flexibilität durch + Leistungsfähigkeit und \index{Konfiguration} Flexibilität durch vielfältige Einstellmöglichkeiten - genannt Konfigurationsparameter. Diese Konfigurationsparameter wirken auf die Erstellung der Unterlegnotenblätter und steuern z.B: - Stimmen, die ausgegeben werden; Stimmen durch - Synchronisiationslinien verbunden werden usw. + Synchronisationslinien verbunden werden usw. - Größe von Notenelementen, Liniendicken - Beschriftungen @@ -93,7 +93,7 @@ Namen des entsprechenden Kongigurationsparameters. In der ABC-Notation wird in den Kopfzeilen ein Standardnotenwert angegeben, z.B. `L:1/4`. Dies bedeutet, daß standardmäßig in Viertelnoten erfasst wird. Ausgehend von diesem Wert ergibt sich der -Notenwert duch Multiplikation mit der angegebenen Länge. Diese +Notenwert durch Multiplikation mit der angegebenen Länge. Diese Längenangaben wird an den Notennamen angehängt. TODO: verweise auf ABC-Kapitel @@ -197,7 +197,7 @@ man sie "notenbezogene Elemente": verwendet werden. Ein Tuplet entsteht, wenn in der ABC-Notation den Noten der Tuplets - eine Klammer mit der Länge des Tupletes vorangestellt wird, z.B: + eine Klammer mit der Länge des Tuplets vorangestellt wird, z.B: "`(3CCC`". - **(23) tie - Haltebogen**: Ein Haltebogen verbindet zwei Noten @@ -233,9 +233,9 @@ man sie "notenbezogene Elemente": wird. Hier ist "Teil 1" die Bezeichnung des Abschnitts. > **Hinweis:** Die Aufteilung in Abschnitte gilt für das gesamte - > Musikstück. daher muss die Bezeichung von Abschnitten in der + > Musikstück. daher muss die Bezeichnung von Abschnitten in der > **ersten Stimme** erfolgen. Sie wirkt dann auf alle Stimmen. - > Abschnittsbezeichungen in den folgenden Stimmen werden ignoriert. + > Abschnittsbezeichnungen in den folgenden Stimmen werden ignoriert. - **(28) countnotes - Zählhilfen**: Zupfnoter kann die Noten automatisch mit Zählhilfen beschriften. Die Zählweise ergibt sich @@ -244,7 +244,7 @@ man sie "notenbezogene Elemente": konfigurationsabhängig (`extract.0.countnotes`). > **Hinweis** die Zählhilfen sind so gesataltet, dass man während - > des Spields die Zeitachse durchzählt. Bei Noten mit mehreren + > des Spiels die Zeitachse durchzählt. Bei Noten mit mehreren > Schlägen beginnt die Zählhilfe immer mit der Nummer des ersten > Schlages (z.B. 2-3 ist eine Note, die bei Schlag 2 beginnt und > zwei Schläge lang gespielt wird, d.h. während diese Note klingt, @@ -252,7 +252,7 @@ man sie "notenbezogene Elemente": - **(29) barnumbers - Taktnummer**: Zupfnoter kann die Takte automatisch durchnummerieren. Damit kann bei gemeinsamem Spiel auch - mitten im Musikstück wieder eingesetz werden. Diese Ausgabe ist + mitten im Musikstück wieder eingesetzt werden. Diese Ausgabe ist konfigurationsabhängig (`extract.0.barnumbers`. - **(30) decoration - Dekoration**: Zupfnoter kann einzelne @@ -265,7 +265,7 @@ man sie "notenbezogene Elemente": Um auf den Unterlegenoten die Zusammenhänge zwischen Noten darzustellen, gibt es folgende Elemente: -- **(25) jumpline for repeat - Sprungline für Wiederholungen**: Eine +- **(25) jumpline for repeat - Sprunglinie für Wiederholungen**: Eine Wiederholung entsteht durch Beifügen eines Doppelpunktes an die Taktstriche in der ABC-Notation z.B. "`|: C4 :|`". @@ -282,8 +282,8 @@ gibt es folgende Elemente: - **(31) flowline - Flusslinie**: Die Flußlinie[^040_UD-Zupfnoter-Referenz.md_1] verbindet die Noten **einer** Stimme und markiert so die Führung innerhalb dieser - **einen** Stimme. Standardmäßig stellt Zupfnoter die Flußline in der - ersten und dritten Stimme dar. + **einen** Stimme. Standardmäßig stellt Zupfnoter die Flußlinie in + der ersten und dritten Stimme dar. Die Ausgabe von Flusslinien für die einzelnen Stimmen hängt von der aktuellen Konfiguration (siehe Kapitel @@ -332,26 +332,26 @@ gibt es folgende Elemente: > **Hinweis**: Wenn die Varianten am Ende einer Wiederholung > stehen, entfällt die Ausgangslinie. Stattdessen wird eine > normale **(25) Sprunglinie für Wiederholung** verwendet. Die - > Positionsangabe der Ausganslinie wird in diesem Fall ignoriert - > und die Positionsangabe der Sprunglinie am Ender der + > Positionsangabe der Ausgangslinie wird in diesem Fall + > ignoriert und die Positionsangabe der Sprunglinie am Ende der > Wiederholung verwendet. - **(53) Folgelinie** ist die Ausgangslinie der letzten Variation. - Diese kann separat positioniert werden, um das gwünschte + Diese kann separat positioniert werden, um das gewünschte Notenbild zu erreichen. - Die Positionen deieser Linien werden als Zusatz vor den Taktstrich + Die Positionen dieser Linien werden als Zusatz vor den Taktstrich der ersten Variation geschrieben (Schaltfläche "Zusatz einfügen" bzw. "Zusatz bearbeiten"). > **Hinweis:** Ab Zupfnoter 1.7 können diese Linien mit der Maus > verschoben werden. Diese Verschiebungen werden in der > Konfiguration gespeichert und von älteren Zupfnoter-Versionen - > nicht verarbeitet. Die Konfiguration über Zusaätze ist aus + > nicht verarbeitet. Die Konfiguration über Zusätze ist aus > Kompatibilitätsgründen noch vorhanden. > **Hinweis:** Zupfnoter stellt die Noten der verschiedenen - > Variationen in unterschiedlicen Grautönen dar. Die Farben können + > Variationen in unterschiedlichen Grautönen dar. Die Farben können > in der Konfigurationsmaske `Layout` über eine Schnelleinstellung > ausgewählt werden (siehe Konfiguration > [extract.x.layout.color](#extract.0.layout.color)). @@ -397,24 +397,24 @@ darstellen zu können, gibt es folgende Elemente: > eingestellt werden (siehe Kapitel > \ref{extract.0.lyrics} [extract.x.lyrics](#extract.0.lyrics)). - > **Hinweis**: In der ABC-Notation kann man Liedtexte mit sowhohl - > mit Kopfzeile `W:`(Großbuchstaben) als auch mit Kopfzeile `w:` - > (Kleionbuchstaben) eingeben. Die Variante mot Kleinbuchstaben wird - > verwendet, um die Lietexte direkt in die Notensyteme zu schreiben. - > Zupfnoter ignoriert diese Liedtexte in den Notenlinien + > **Hinweis**: In der ABC-Notation kann man Liedtexte mit sowohl mit + > Kopfzeile `W:`(Großbuchstaben) als auch mit Kopfzeile `w:` + > (Kleinbuchstaben) eingeben. Die Variante mit Kleinbuchstaben wird + > verwendet, um die Liedtexte direkt in die Notensysteme zu + > schreiben. Zupfnoter ignoriert diese Liedtexte in den Notenlinien > **Hinweis**: Auch wenn die ABC-Notation es erlaubt, die Kopfzeilen - > `W:` im ganezn ABC-Text zu verteilen ist es wichtig, die Liedtexte + > `W:` im ganzen ABC-Text zu verteilen ist es wichtig, die Liedtexte > dennoch in einem Block zusammenzufassen. Sonst meldet Zupfnoter, > dass es mehrere Liedtexte gibt. Der Editor fasst sie alle > zusammen, löscht aber die anderen Blöcke nicht. Das muss manuell > korrigiert werden. > **Hinweis**: Zupfnoter ignoriert Leerzeichen am Anfang von - > Liedtexten. Macnhmal möchte man aber den Liedtext in bestimmten + > Liedtexten. Manchmal möchte man aber den Liedtext in bestimmten > Zeilen etwas einrücken um den Text um eine Note im - > Unterlegnotenblatt herumfließen zu lassen. Wenn aleo eine - > Textzeile mit einer Reihe Tilde (`~`) - Zeichen beginnt werden + > Unterlegnotenblatt herumfließen zu lassen. Wenn also eine + > Textzeile mit einer Reihe Tilde (`~`) - Zeichen beginnt, werden > diese in den Unterlegnoten als Leerraum ausgegeben und so der > Textbeginn nach rechts verschoben. @@ -488,8 +488,8 @@ und das Einelgen in das Instrument zu vereinfachen: ### Vordefinierte Blattbeschriftungen -Zupfnoter bietet eine Reihe von Vorlagen für die Seitenbeschrifungen. -Damit lässt sich ein einheitliches Vorgehen bei der Beschrifung der +Zupfnoter bietet eine Reihe von Vorlagen für die Seitenbeschriftungen. +Damit lässt sich ein einheitliches Vorgehen bei der Beschriftung der Unterlegnoten erreichen. Diese können in der Konfigurationsmaske "Seitenbeschriftung" eingegeben werden. Zupfnoter hat geeignete Vorgabewerte für die Position und Schriftart dieser Beschriftungen. @@ -574,7 +574,7 @@ unterscheiden. Daher wird hier noch einmal eine Zusammenfassung gegeben: \ref{annotations} [annotations](#annotations) \index{Notenbeschriftungsvorlage} mit Positionsangabe anlegen und über einen Zusatz (Schaltfläche "Ref. Notenbeschriftung") daraus - eine Notenbeschrifung erstellen. + eine Notenbeschriftung erstellen. > **Hinweis**: Zupfnoter kennt standardmäßig die > Noptenbeschriftungsvorlagen `vl` `vt`, `vr`. Damoit kann man @@ -637,13 +637,12 @@ Zupfnoter kennt drei Fenster[^040_UD-Zupfnoter-Referenz.md_4]: [Eingabe](#eingabefenster-details)): - `ABC`- Der Texteditor für die ABC-Notation - - `Liedtextexte` für die Erfassung der Liedtexte + - `Liedtexte` für die Erfassung der Liedtexte - `Konfiguration` für die formulargeführte Bearbeitung der Zupfnoter-Konfiguration. - Im **rechten oberen Fenster** (Kapitel \ref{notenvorschau} [Eingabe](#notenvorschau)) wird in der herkömmlichen Notenschrift - das Musikstück gezeigt, und kann somit musikallisch überprüft - wreden. + das Musikstück gezeigt, und kann somit musikalisch überprüft wreden. Die Darstellung in herkömmlicher Notenschrift kann mehrstimmig erfolgen (gesteuert über die `%%score` - Anweisung in der @@ -662,10 +661,10 @@ Zupfnoter kennt drei Fenster[^040_UD-Zupfnoter-Referenz.md_4]: Die Anordnung dieser Fenster ist in Zupfnoter fest vorgegeben. Man kann aber während der Arbeit folgende Einstellungen vornehmen, um den -aktuellen Arbeitsschrit besser zu unterstützen: +aktuellen Arbeitsschritt besser zu unterstützen: - Fenstergröße verstellen: Die Trennlinien zwischen den Fenstern - können mit der MAus verschoben werden, um Platz für die aktuell + können mit der Maus verschoben werden, um Platz für die aktuell wichtigen Elemente zu schaffen - Über das Menü **"`Ansicht`"** kann man einzelne Fenster ausblenden so dass die anderen Fenster größer werden (Siehe Kapitel @@ -685,12 +684,12 @@ Fenster die aufscheinen, um bestimmte Informationen einzugeben bzw. zu [Dein erstes Musikstück eingeben](#dein-erstes-musikstueck-eingeben)). > **Hinweis**: Der Begriff "Fenster" wird sowohl für die Fenster des -> Betriebssytems als auch die Fenster innerhalb Zupfnoter verwendet. +> Betriebssystems als auch die Fenster innerhalb Zupfnoter verwendet. ### Werkzeugleiste für Schaltflächen und Menüs {#menues-im-hauptfenster} Die Zupfnoter - Werkzeugleiste ist immer sichtbar (also auch in allen -Ansichten) und ersteckt sich über aller Fenster. In ihr befinden sich +Ansichten) und erstreckt sich über aller Fenster. In ihr befinden sich Schaltflächen und Menüs die man während der Erstellung von Unterlegnoten benötigt. Nach einem Klick auf die Schaltflächen führt der Zupfnoter bestimmte Aktivitäten aus. @@ -698,7 +697,7 @@ bestimmte Aktivitäten aus. Einige Funktionen sind auch über Tastenkombinationen (Shortcuts) erreichbar (siehe Kapitel \ref{shortcuts} [Shortcuts](#shortcuts)) -> **Hinweis**: Für die Vesrion 1.5 wird die Bedienungsoberfläche von +> **Hinweis**: Für die Version 1.5 wird die Bedienungsoberfläche von > Zupfnoter verbessert. Daher sind die Informationen in diesem Kapitel > vorläufig. @@ -763,10 +762,10 @@ erreichbar (siehe Kapitel \ref{shortcuts} [Shortcuts](#shortcuts)) abspeichern, aber auch dann muss sie über den Browser gedruckt werden. - > **Hinweis**: Wenn du eine PDF - Datei davon haben möchest, + > **Hinweis**: Wenn du eine PDF - Datei davon haben möchtest, > musst diese mit "Bordmitteln" deines PC erstellen. Du kannst - > auch eines der gänigen ABC-Programme verwenden (z.B. Easy-ABC) - > um die Noten zu drucken. + > auch eines der gängigen ABC-Programme verwenden (z.B. + > Easy-ABC) um die Noten zu drucken. - Menü **Ansicht** (Ansicht): Hiermit kann man festlegen, wie der Bildschirmaufbau des Zupfnoter gestaltet sein soll. Einige Fesnter @@ -775,14 +774,14 @@ erreichbar (siehe Kapitel \ref{shortcuts} [Shortcuts](#shortcuts)) - Die Einstellung **Alle Fenster** ist der Standardbildschirmaufbau mit allen drei Fenstern (Eingabe, - herkömmliche Noten, Unterlegnoten). In dieser Enstellung wird + herkömmliche Noten, Unterlegnoten). In dieser Einstellung wird meistens gearbeitet, weil man eine schnelle Rückmeldung zu den Ergebnissen hat. - - Die Einstellung **Noteneingabe** zeigt das Eingebaefenster + - Die Einstellung **Noteneingabe** zeigt das Eingabefenster (linkes Fenster) und die Notenvorschau (Fenster rechts oben). Diese Einstellung ist hilfreich, wenn man sich zunächst auf die - reine Eingabe des Muskstücks konzentrieren will. + reine Eingabe des Musikstücks konzentrieren will. - Die Einstellung **Harfeneingabe** zeigt das Eingabefenster (linkes Fenster) und die Harfennotenvorschau (Fenster rechts @@ -798,7 +797,7 @@ erreichbar (siehe Kapitel \ref{shortcuts} [Shortcuts](#shortcuts)) > rot dargestellt. - Mit der Einstellung **Harfennoten** (Harfe) sieht man nur eine - Vorschau der Unterlegnoten. Diese Einstellugn ist hilfreich zur + Vorschau der Unterlegnoten. Diese Einstellung ist hilfreich zur endgültigen Prüfung der erstellten Unterlegnoten z.B. durch einen Lektor. @@ -821,14 +820,14 @@ erreichbar (siehe Kapitel \ref{shortcuts} [Shortcuts](#shortcuts)) 1.te und 2.te Stimme. Der Auszug 2 könnte dann z.B. zur Darstellung der 3.ten und 4.ten Stimme dienen. - TODO: Überarbeiten nach Verbesserung der Bedienung von Auszuügen. + TODO: Überarbeiten nach Verbesserung der Bedienung von Auszügen. - Schaltfläche **Rendern** (umwandeln): (alternativ Tastenkombination `cmd/ctrl - R` bzw. `cmd/ctrl - RETURN`. Mit Klick auf diese Schaltfläche werden die Ansicht der Unterlegnoten und die Fehlermeldungen im Texteditor des - Eingebefensters aktualisiert. + Eingabefensters aktualisiert. > **Hinweis:** Diese Funktion sollte häufig genutzt werden, um immer > aktuelle Ergebnisse auf dem Bildschirm zu sehen. @@ -848,7 +847,7 @@ erreichbar (siehe Kapitel \ref{shortcuts} [Shortcuts](#shortcuts)) - wenn mehrere Noten selektiert sind, spielt Zupfnoter nur genau die selektierten Noten. Damit kann man eine Detailkontrolle - errreichen. + erreichen. > **Hinweis:** Bitte beachte: > @@ -867,14 +866,14 @@ erreichbar (siehe Kapitel \ref{shortcuts} [Shortcuts](#shortcuts)) > **Hinweis**': Über das Hilfe Menü kann man auch Beispiele > aufrufen. Diese öffnen ein neues Zupfnoter-Fenster im Demo - - > Modus. In desem Modus kann man nicht speichern oder öffen. Die - > entprschenden Menüpunkte sind inaktiv. + > Modus. In desem Modus kann man nicht speichern oder öffnen. Die + > entsprechenden Menüpunkte sind inaktiv. > > Der aktuelle Modus wird in der Statuszeile angezeigt. ### Fenster links: Eingabe {#eingabefenster} -Das Eingeabefenster enthält seinerseits +Das Eingabefenster enthält seinerseits - eine eigene Werkzeugleiste zu Ansteuerung von Bearbeitungsfunktionen - verschiedene Bearbeitungsansichten, welche über Karteireiter @@ -894,7 +893,7 @@ Das Eingeabefenster enthält seinerseits > werden, da sie in der Konfiguration noch nicht vorhanden sind. > > Die Werte der eingefügten Parameter können dann über die - > Konfigurationsmaken oder im Texteditor geändert werden. + > Konfigurationsmasken oder im Texteditor geändert werden. Die Reihenfolge der Menüpunkte entspricht der Bearbeitungsabfolge, wobei Menüpunkte auch übersprungen werden dürfen. Die Erstellung der @@ -931,7 +930,7 @@ Das Eingeabefenster enthält seinerseits die Position von Sprunglinien anzugeben oder notengebundene Anmerkungen zu erfassen. Diese Zusätze sind an eine Note bzw. an einen Taktstrich gebunden und werden in Form einer ABC-Anmerkung - notiert (z.B.`"^@@3" :|` für die Lage einer Sprungline für eine + notiert (z.B.`"^@@3" :|` für die Lage einer Sprunglinie für eine Wiederholung). > **Hinweis**: Dieses Menü wird daher erst dann aktiv, wenn die @@ -948,7 +947,7 @@ Das Eingeabefenster enthält seinerseits - Schaltfläche **Zusatz bearbeiten** - Über diese Schalzfläche kann man die Bearbeitungsmasken für + Über diese Schaltfläche kann man die Bearbeitungsmasken für vorhandene Zusätze erneut aufrufen. > **Hinweis**: Diese Schaltfläche ist erst aktiv, wenn die @@ -983,7 +982,7 @@ Texteditor der Eingabe und in der Unterlegnotenvorschau hervorgehoben. > **Hinweis::** Wenn man zunächst eine Note anklickt, und dann mit > gedrückter "Shift"-Taste ("Umschalttaste") eine zweite Note anklickt, > dann werden die dazwischen liegenden Noten selektiert. Damit kannst du -> z.B. einen Auschnitt aus einer bestimmten Stimme über die +> z.B. einen Ausschnitt aus einer bestimmten Stimme über die > Notenvorschau auswählen und anschließend abspielen lassen. ### Fenster rechts unten: Unterlegnotenvorschau {#unterlegnotenvorschau} @@ -1020,8 +1019,8 @@ Einträgen - Aktueller Modus von Zupfnoter. Hier gibt es `work` und `demo`. im Demo-Modus sind einge Menüpunkte nicht aktiv. - Name des Konfigurationsparameters für das Element unter dem - Mauszeiger falls dieses mit der Maus veschoben werden kann oder über - das Kontext-Menü konfiguriert werden kann. + Mauszeiger falls dieses mit der Maus verschoben werden kann oder + über das Kontext-Menü konfiguriert werden kann. ### Konsole {#konsole-fenster} @@ -1039,39 +1038,60 @@ Andererseits gibt es gerade in der Konsole manche experimentelle Zusatzfunktion, die noch nicht an die grafische Oberfläche angeschlossen ist. +Folgende Befehle zum Arbeiten mit voreingestellen Auszügen bzw. +Beschriftungen + - `setstdnotes`: kopiert dem aktuellen Stück die Konfiguration der Blattbeschriftungen usw um sie auf ein anderes Stück zu übertragen. - `stdnotes`: überträgt die zuletzt kopierte Konfiguration der - Blattbeschriftungen auf das aktuelle Stück -- `stdectract`: überträgt die zuletzt kopierte Konfiguration der - Auszüge auf das aktuelle Stück + Blattbeschriftungen auf das aktuelle Stück in den aktuellen Auszug. - `setstdextract`: kopiert aus dem aktuellen Stück die Konfiguration der Auszüge, um sie auf ein anderes Stück zu übertragen. +- `stdectract`: überträgt die zuletzt kopierte Konfiguration der + Auszüge auf das aktuelle Stück + + > **Hinweis**: Diese Befehle sind hilfreich um schnell die + > Konfiguration eines aus MusicXml importierten Stückes + > einzustellen. -> **Hinweis**: Diese Befehle sind hilfreich um schnell die Konfiguration -> eines aus MusicXml importierten Stückes einzustellen. +Über folgende Befehle können Flußlinien gestaltet werden: - `setsetting flowconf edit`: Mit dieser Einstellung werden die - Flußlinen bearbeitbar, d.h. man kann die Flußlininen mit der Maus + Flußlinien bearbeitbar, d.h. man kann die Flußlinien mit der Maus verformen, (sozusagen verbiegen). - `setsetting flowconf none`: Mit dieser Einstellung werden die Flußlinien nicht mehr bearbeitbar. Bearbeitete Flußlinien bleiben weiterhin "verbogen". -> **Hinweis:** Wenn die Bearbeitung der Flußlinien eingeschaltet ist, -> wird Zupfnoter deutlich langsamer. Daher wird diese Einstellung beim -> Neuladen von Zupfnoter zurückgesetzt. + > **Hinweis:** Wenn die Bearbeitung der Flußlinien eingeschaltet + > ist, wird Zupfnoter deutlich langsamer. Daher wird diese + > Einstellung beim Neuladen von Zupfnoter zurückgesetzt. + +Selbst wenn Zupfnoter die Eingabe fehlerhafter Konfigurationsparameter +eigentlich verhindern soll, so kann es trotzdem vorkommen. Wenn also +schwer verständliche Meldungen erscheinen kann man eine erweiterte +Prüfung der Konfigurationsparameter vornehmen: - `setsetting validate true`: Diese Einstellung bewirkt eine extra - Prüfung/Validierung der Konfigurationsparamter. + Prüfung/Validierung der Konfigurationsparameter. - `setsetting validate false`: Diese Einstellung beendet eine extra - Prüfung/Validierung der Konfigurationsparamter. + Prüfung/Validierung der Konfigurationsparameter. - `editconf errors`: Damit werden die fehlerhaften Konfigurationsparameter in den Konfigurationseditor geladen. -> **Hinweis:** Diese Prüfungen sind noch nicht ausgereift und daher -> standardmässig ausgeschaltet. Auch zeigt der Editor noch nicht die -> Fehler noch nicht genau genug an. + > **Hinweis:** Diese Prüfungen sind noch nicht ausgereift und daher + > standardmässig ausgeschaltet. Auch zeigt der Editor noch nicht die + > Fehler noch nicht genau genug an. + +Folgende Befehle sind für die Arbeit mit Dateivorlagen: + +- `editconf template`: Damit kann man die Eigenschaften für ein + File-Template einstellen. Im Wesentlichen ist das der Dateiname. +- `edittemplate`: Damit wird die aktuelle Dateivorlage zur Bearbeitung + geladen () + +> **Hinweis:** Weitere Informationen hierzu siehe [Arbeiten mit +> Dateivorlagen](#filetemplates) Weiterhin zeigt die Konsole einige Meldungen, die für die Fehleranalyse hilfreich sind. Insbesondere, wenn der "debug" - Modus eingestellt ist. @@ -1085,7 +1105,7 @@ hilfreich sind. Insbesondere, wenn der "debug" - Modus eingestellt ist. Die Konsole kann auch für eine bessere Fehlersuche in der Konfiguration verwendet werden. Selbst wenn Zupfnoter die Eingabe fehlerhafter -Konfigurationsparamert eigentlich verhindern soll, so kann es trotzdem +Konfigurationsparameter eigentlich verhindern soll, so kann es trotzdem vorkommen. Wenn also schwer verständliche Meldungen erscheinen kann man den loglevel debug einschalten. Dann kann man in der Konsole mit @@ -1148,13 +1168,13 @@ Eingabemöglichkeiten nutze: ### Erfassung der ABC-Notation im Texteditor {#texteditor} -Im Teexteditor kannst du die ABC-Notation bearbeiten. Darüberhinaus +Im Texteditor kannst du die ABC-Notation bearbeiten. Darüberhinaus kannst du die Konfigurationsparameter sehen und ggf. direkt (d.h. ohne Bildschirmmasken) sehen und ggf. korrigieren (für Experten). Im Texteditor kannst du die ABC-Notation erfassen. Elemente werden -entsprechend ihrer Bedetung farblich hervorgehoben (Syntax-Coloring). In -der Statusleiste links unten zeigt Zupfnoter auch Hinweise über die +entsprechend ihrer Bedeutung farblich hervorgehoben (Syntax-Coloring). +In der Statusleiste links unten zeigt Zupfnoter auch Hinweise über die Bedeutung des Elementes links von der aktuellen Schreibmarke an. > **Hinweis**: Diese Anzeige ist noch sehr technisch, in manchen Fällen @@ -1185,8 +1205,8 @@ etwas hinzufügen möchtest. > wird dies von Zupfnoter ignoriert. > **Hinweis**: Auch wenn der Texteditor die Zusätze, die Liedtexte und -> die Konfigurationsparamter anzeigt ist es doch besser, die grafischen -> Barbeitungsmöglichnkeiten zu nutzen: +> die Konfigurationsparameter anzeigt ist es doch besser, die grafischen +> Barbeitungsmöglichkeiten zu nutzen: > > - (Kapitel \ref{liedtexteditor} [Masken für > Zusätze](#liedtexteditor)) @@ -1320,7 +1340,7 @@ muss auch das Einfügen / Löschen von Konfigurationsparametern über die Masken möglich sein. Daher gibt es in den Konfigurationsmasken pro Parameter je eine Zeile mit den folgenden Elementen: -- `Löschen` - Löscht den Paramter aus der Konfiguration +- `Löschen` - Löscht den Parameter aus der Konfiguration > **Hinweis**: Diese Taste kann ggf. einen ganzen Auszug löschen > (wenn man die `Löschen` - Button an einem Auszug drückt. Also sei @@ -1335,7 +1355,7 @@ Parameter je eine Zeile mit den folgenden Elementen: Gruppierungen gibt es kein Eingabefeld, da hier die Werte in die Unterparameter eingetragen werden. - `Hilfe` - zeigt eine spezifische Hilfe für diesen Parameter an -- `aktuell wirksamer Wert` - zeigt den Wert an, der für den Paramter +- `aktuell wirksamer Wert` - zeigt den Wert an, der für den Parameter gerade gültig ist. > **Hinweis**: Hier wird ggf. der Wert aus `extract.0` angezeigt @@ -1360,11 +1380,11 @@ Für die Bedienung der Masken ist noch wichtig `Refresh` die Maske neu aufgebaut werden. Dies ist z.B. dann notwendigWenn der Konfigurationsparameer außerhalb der Maske geändert wird (z.B. im Texteditor). -- Schalltfläche `Neuer Eintrag`: Diese Taste fügt eine neue Instanz +- Schaltfläche `Neuer Eintrag`: Diese Taste fügt eine neue Instanz eines Parameters ein. Sie ist nur aktiv, wenn es für einen Parameter mehrere Instanzen geben kann (z.B. \index{Liedtexte}Liedtexte - [lyrics.x], \index{Seitenbeschriftung}Seitenbeschrifung [notes.x]) -- Schalltfläche `Schnelleinstellungen`: Diese Taste öffnet ein Menü, + [lyrics.x], \index{Seitenbeschriftung}Seitenbeschriftung [notes.x]) +- Schaltfläche `Schnelleinstellungen`: Diese Taste öffnet ein Menü, aus dem du für die aktuelle Maske eine Voreinstellung auswählen kannst. Eine solche Voreinstellung ist eine sinnvolle Kombination von Parametern für einen bestimmten Fall (z.B. für ein "kompaktes @@ -1395,9 +1415,9 @@ Eingabefensters](#werkzeugleiste-des-eingabefensters)). > **Hinweis**: Der Aufruf von "Zusatz einfügen" und "Zusatz bearbeiten" > liegt auf unterschiedlichen Schaltflächen, da beim "Einfügen" ein Menü -> erscheint über welches ausgewählt wird, "was" eingefügt weden soll. +> erscheint über welches ausgewählt wird, "was" eingefügt werden soll. > Beim Bearbeiten ist diese Auswahl nicht mehr notwendig. Daher wird -> "bearbeiten" über eine Schaltflcähe direkt aufgerufen. +> "bearbeiten" über eine Schaltfläche direkt aufgerufen. > > > ![](../ZAUX_Images/040-050_Menue-fuer-zusaetze.jpg)  @@ -1413,17 +1433,17 @@ Unterlegnotenblatt betreffen, lassen sich auch mit der Maus vornehmen: - Positionierung von Texten (Titel, Legende, Beschriftung usw.) - Anordnung von Sprunglinien - Gestalt der Triolenbogen (Tuplet) -- Gestalt der Flußlinien (experminetell) +- Gestalt der Flußlinien (experimentell) Für die grundsätzliche Bedienung gilt: - Wenn du den Mauszeiger über ein solches Element bewegst, ändert dieser seine Form. Darüber hinaus zeigt die Statusleiste rechts - unten, welcher Konfigurationsparamter verwändert wird. + unten, welcher Konfigurationsparameter verändert wird. - Bei solchen Elementen ruft das Kontextmenü **`Edit config`** den entsprechenden Konfigurationseditor auf. -- Nach dem Beargbeiten des Elementes mit der Maus wird das Element - rot. Bitte führe einen "Render" aus um die Unterlegnotenvorschau zu +- Nach dem Bearbeiten des Elementes mit der Maus wird das Element rot. + Bitte führe einen "Render" aus um die Unterlegnotenvorschau zu aktualisieren. > **Hinweis**: Bitte beachte, dass manche Einstellungen am Zeitbezug der @@ -1441,13 +1461,13 @@ Für die grundsätzliche Bedienung gilt: > mehr genutzte Konfigurationen übrig bleiben. Diese werden nicht > entfernt und könnten später zu unerwarteten Effekten führen. In diesem > Fall ist es am besten mit der rechten Maustaste in der -> Harfennotenvorschau die entpreschende Konfiguration auzurufen, zu +> Harfennotenvorschau die entsprechende Konfiguration aufzurufen, zu > löschen und neu zu erstellen. ### Texte verschieben Du kannst Titel, Legende, Notenbeschriftungen, Blattbeschriftungen, -Taktnummern, Zählhinweise, Variatnenbezeichenr, Bezeichner von Parts mit +Taktnummern, Zählhinweise, Variantenbezeichner, Bezeichner von Parts mit der Maus verschieben. ### Sprunglinien verschieben @@ -1458,7 +1478,7 @@ Linen rasten beim ziehen mit der Maus zwischen den Saiten ein. > **Hinweis**: Bei varianten Enden wirkt der selbe > Konfigurationsparameter ggf. auf mehrere Sprunglinien. Bitte drücke > daher auf `Render` um das Endergebnis zu sehen. Danach sind auch die -> Pfeile an den Sprunglineine wieder korrekt. +> Pfeile an den Sprunglinien wieder korrekt. ### Triolenbogen gestalten @@ -1469,20 +1489,20 @@ zu bieten hat :-). Aber mit der Maus geht es ganz einfach: - wenn man genau hinschaut, dann siehst du an den Triolenbögen zwei kleine Griffe. Wenn du die Maus darüber bewegst, kann due diese mit - gedrückter Maustaste bwegegen. + gedrückter Maustaste bewegen. - wenn du die Maus bewegst, ändert sich das Bild zu einem Trapez. Der - entstezende Bogen wird durch zwei Kontrolpunkte (die oberen Ecken + entstehende Bogen wird durch zwei Kontrollpunkte (die oberen Ecken des Trapezes) gestaltet. Im vorstehenden Bild wurde der linke Griff (d.h. der linke Kontrollpunkt) bewegt. -> **Hinweis**: Am besgten experimentierst du ein bisschen, um Erfahrung +> **Hinweis**: Am besten experimentierst du ein bisschen, um Erfahrung > zu sammeln. Es würde zu weit führen, hier alle Möglichkeiten > darzustellen. > **Hinweis**: Es kann vorkommen, dass die Griffe von Noten verdeckt und > daher mit der Maus nicht erreichbar sind. In diesem Fall kannst du an > der Triolenbeschriftung oder an einem andere Griff `Edit Cconfig` -> aufrufen und den Kontrollpunkt so ändern, dass er wireder sichtbar +> aufrufen und den Kontrollpunkt so ändern, dass er wieder sichtbar > wird. ## Flußlinien gestalten {#flowconf} @@ -1490,10 +1510,10 @@ zu bieten hat :-). Aber mit der Maus geht es ganz einfach: Bei manchen Stücken kommt es vor, dass die Flußlinie einer Stimme durch die Begleintnoten verläuft. In diemesm Fall muss man ggf. die Flußlinie um die Begleitnonten "herumbiegen". Da zu gibt es eine experimentelle -Möglichkeit die Flußlinine mit der Maus zu gestalten, ähnlich wie die +Möglichkeit die Flußlinie mit der Maus zu gestalten, ähnlich wie die Triolenbögen. -Die Bearbeitungsmöglickeiten müssen in der [Konsole](#konsole-fenster) +Die Bearbeitungsmöglichkeiten müssen in der [Konsole](#konsole-fenster) eingeschaltet werden. > **Hinweis:** Wenn die Bearbeitung der Flußlinien eingeschaltet ist, @@ -1513,28 +1533,28 @@ für verschiedene Zielgruppen erstellen, z.B.: - Gesamtansicht für Lektoren - Einzelstimmen für Anfänger (z.B. nur die erste Stimme, Zählhilfen) -- Beliebige Kombinatinen von Stimmen für Leiter und Fortgeschrittene +- Beliebige Kombinationen von Stimmen für Leiter und Fortgeschrittene (z.B. zwei Stimmen, aber keine Zählhilfen mehr) - verschiedene Hilfsinformationen (Zählhilfen, Taktnummern etc.) - Sonstige Einstellungen (z.B. Druckeroptimierung usw.) Für jeden Auszug gibt es einen Satz von Konfigurationsparameetern (`extract.0`, `extract.1`) usw. welcher den Inhalt des jeweiligen -Auszuges bestimmt. Über die Schaltflcähe `Auzzug` kannst aktuell aktiven +Auszuges bestimmt. Über die Schaltfläche `Auszug` kannst aktuell aktiven Auuszug einstellen. Der aktive Auszug bestimmt, - was in der Unterlegnotenvorschau angezeigt wird - auf welchen Auszug die Konfigurationsmasken wirken. -Die Auszuüge werden durchnummeriert[^040_UD-Zupfnoter-Referenz.md_6]. +Die Auszüge werden durchnummeriert[^040_UD-Zupfnoter-Referenz.md_6]. Der Auszug mit der **Nummer 0** hat eine besondere Rolle: Er gilt als -Vorgabe für die anderen Auszuüge. Die im Auszug 0 angegebenen Werte für +Vorgabe für die anderen Auszüge. Die im Auszug 0 angegebenen Werte für die Konfigurationsparameter wirken also auf die Auszüge mit höherer Nummer solange sie dort nicht überschrieben werden. Damit kannst du im Auszug 0 die grundlegenden Einstellungen vornehmen -und in den höherern Auszügen spezifische Anforderungen erfüllen. +und in den höheren Auszügen spezifische Anforderungen erfüllen. Einstellungen, die auch im Auszug 0 nicht definiert sind, belegt Zupfnoter mit programminternen Voreinstellungen. Diese Vorgabewerte sind @@ -1545,7 +1565,7 @@ so, dass folgende Auszüge definiert entstehen. - Auszug 2: Tenor, Bass Dabei wird von einem vierstimmigen Satz ausgegangen und Flusslinien, -Synchronsiationslinen, Stimmenauswahl etc. darauf abgestimmt. +Synchronisationslinien, Stimmenauswahl etc. darauf abgestimmt. \needspace{15cm} @@ -1555,7 +1575,7 @@ Die folgende Abbildung illustriert das Konzept der Auszüge: In diesem Beispiel kannst du die Zusammenhänge sehen: -- Auszug 0 ist hier so konifugriert +- Auszug 0 ist hier so konfiguriert - alle Stimmen (1,2,3,4) - Wiederholungszeichen statt Sprunglinien @@ -1571,7 +1591,7 @@ In diesem Beispiel kannst du die Zusammenhänge sehen: - nur Stimme 3 und 4 Voreinstellung in Zupfnoter entspricht.) - andere Positionierung der Legende - andere Aufteilung der Liedtexte: - - Alle Strphen in einem Block (Angabe `"verses": [1,2,3,4]`) + - Alle Strophen in einem Block (Angabe `"verses": [1,2,3,4]`) - Liedtextblock 2 enthält keine Strophen mehr (Angabe `"verses" : [0]`). Diese Angabe ist notwendig, weil sonst die in Auszug 0 definerten Strophen wirksam bleben. @@ -1579,9 +1599,9 @@ In diesem Beispiel kannst du die Zusammenhänge sehen: > **Hinweis**: Die Angaben der auszugebenden Stimmen könnte an sich > entfallen, da da sie der Voreinstellung in Zupfnoter entsprechen. Sie -> sind hir nur zur Illustration sufgeführt. +> sind hir nur zur Illustration aufgeführt. -### Praktisches Vorgehen bei der Erstellung von Auszügen +### Praktisches Vorgehen bei der Erstellung von Auszügen {#bestPracticeExtract} Das Konzept der Auszüge in Zupfnoter ist ein mächtiges Werkzeug. Mächtige Werkzeuge müssen aber mit Bedacht eingesetzt werden, wenn man @@ -1601,8 +1621,8 @@ Daher ist folgendes Reihenfolge zu empfehlen: 2. **Anlegen der Auszüge**: Ausgehend von der Planung sollte unter dem Menü **`Konfig. bearbeiten / Auszugsbeschriftung`** alle geplanten - Auszüge angelegt werden. Dabei sollte "Titel", "Auzszugsnummer", - "Filenamezusatz" festegelegt werden. Der eingegebenen Titel wird nun + Auszüge angelegt werden. Dabei sollte "Titel", "Auszugsnummer", + "Filenamezusatz" festgelegt werden. Der eingegebenen Titel wird nun auch für das Menü zur Einstellung des Auszuges verwendet. ![](../ZAUX_Images/040-041_Auszugsbeschriftung.jpg)  @@ -1610,15 +1630,15 @@ Daher ist folgendes Reihenfolge zu empfehlen: 3. **Bearbeitung der gemeinsamen Anteile**: Nun kannst du über das Menü `Konfig. bearbeiten / Grundeinstellungen` die Maske für die Grundeinstellungen aufrufen. Die hier gesetzten Einstellungen wirke - **auf alle nachfolgenden** Auszuüge. Daher ist es sinnvoll, z.b. + **auf alle nachfolgenden** Auszüge. Daher ist es sinnvoll, z.b. Flusslinien, Synchronisationslinien, Wiederholungen usw. für alle - Stimmmen zu konfigurieren. Am besten konfiguriert man so weit, dass + Stimmen zu konfigurieren. Am besten konfiguriert man so weit, dass das Blatt gut aussieht, d.h. Position der Legende und Liedtexte sollte möglichst auf Auszug 0 erfolgen. - Auch die Sprunglinien sollten weitgehend in Auzszug 0 konfiguriert - werden. Nur in Ausnamefällen ist eine weitere Positionierung in - anderen Auszuügen notwendig. + Auch die Sprunglinien sollten weitgehend in Auszug 0 konfiguriert + werden. Nur in Ausnahmefällen ist eine weitere Positionierung in + anderen Auszügen notwendig. Als Faustregel gilt, so viel wie möglich auf Auszug 0 zu konfigurieren, so dass man im Grunde bei den Folgeauszügen nur noch @@ -1626,15 +1646,15 @@ Daher ist folgendes Reihenfolge zu empfehlen: 4. **Bearbeitung der folgenden Auszüge**: Wenn Auszug 0 gut konfiguriert ist, dann kann man sich den anderen Auszügen zuwenden. - Dazu wird der zu bearbeitende Auszug im Menü rects oben eingestellt. - Die Konfigurationsmasken und Einstellungen mit der Maus wirken nun - auf den eingestellten Auszug. + Dazu wird der zu bearbeitende Auszug im Menü rechts oben + eingestellt. Die Konfigurationsmasken und Einstellungen mit der Maus + wirken nun auf den eingestellten Auszug. > **Hinweis**: Es ist eine häufige Fehlerquelle, dass man nicht den > richtigen Auszug eingestellt hat. Daher ist es wichtig den > eingestellten Auszug immer wieder zu überprüfen. > ![](../ZAUX_Images/040-042_Pruefen-Auszug-Grundeinstellungen.jpg)  - > Im vorliegenden Fall wird Auzug 0 konfiguriert. + > Im vorliegenden Fall wird Auszug 0 konfiguriert. In den weiteren Auszügen kann man sich konzentrieren auf: @@ -1650,7 +1670,7 @@ Daher ist folgendes Reihenfolge zu empfehlen: Die flexible Konfiguration von Zupfnoter erlaubt die Anpassung der Auasgabe auf viele verschiedene Instrumente. Allerdings führt hier meist eine Kombination verschiedener Parameter zu Ziel. Zur Vereinfachung sind -diese Konmbinationen für gebräücliche Instrumente hinterlegt. +diese Kombinationen für gebräuchliche Instrumente hinterlegt. Wähle das Menü **"`Konfig. bearbeiten > Instrument spez.`"**. Es erscheint eine Maske mit den Parametern deren Zusammenspiel die Ausgabe @@ -1663,7 +1683,7 @@ Instrument auswählen. > **Hinweis**: Bitte beachte, dass es auch einen Parameter "Instrument" > gibt. Dieser ist nicht zu verwechseln mit der Schnelleinstellung, auch -> wenn er zum Teil dieselben Bezeichungen verwendet. Der Parameter +> wenn er zum Teil dieselben Bezeichnungen verwendet. Der Parameter > `Instrument` veränderte Programminterne Abläufe welche sich nicht über > Konfiguration ausdrücken lässt (z.b. diatonische Stimmung bei > Saitenspiel) @@ -1689,11 +1709,11 @@ kannst dann die Eingaben korrigieren bis "Rendern" wieder funktioniert. Wenn das Musikstück nicht auf die Harfe passt, kann man es ggf. durch transponieren zurecht schieben. Dazu gibt man in der ABC-Notation z.B. -die folgende Kopfzeile ein. Diese veschiebt das Stück drei Halbtnach -unten (in den Unterlegnoten also nach links). +die folgende Kopfzeile ein. Diese verschiebt das Stück drei Halbtöne +nach unten (in den Unterlegnoten also nach links). > **Hinweis**: Zupfnoter gibt die Transponierung der ersten Stimme im -> Unterlegnotenblatt aus. Abweichende Transpnierungen in den anderen +> Unterlegnotenblatt aus. Abweichende Transponierungen in den anderen > Stimmen werden zwar ausgeführt, aber nicht vermerkt. Dazu gibt es mit ABC 2.2 eine standardisierte Spezifikation, die ab @@ -1728,7 +1748,7 @@ Beispiel: Im Folgenden wird die Setzpartitur von C nach G transponiert. K:C shift=CG CDE -is äquivalient zu +is äquivalent zu K:G GAB @@ -1746,7 +1766,7 @@ Dies erreicht man mit `%%score 1 2 3 4` -Das bewirkt ein Notensystem mit einer Noteznzeile pro Stimme. Weitere +Das bewirkt ein Notensystem mit einer Notenzeile pro Stimme. Weitere Einzelheiten im nächsten Kapitel. In diesem Zusammenhang ist es auch hilfreich, die Taktnummern @@ -1760,7 +1780,7 @@ auszuschalten dient die Kopfzeile > **Hinweis** Bei zu kurzen Takten erscheint die Taktnummer nicht > korrekt. -### Mehrere Stimmen in ABC-Notation {#mherere-Stimmen-in-abc} +### Mehrere Stimmen in ABC-Notation {#mehrere-Stimmen-in-abc} Da das im Zupfnoter-tutorial dieses Thema eher knapp behandelt ist gibt es hier weitere Informationen. @@ -1778,9 +1798,9 @@ Aufbau Darin ist -- `` eine Identifiaktion der Stimme, sie wird inder `%%score` - - Anweisung referenziert. Es empfhiehlt sich hier einfach ganze Zahlen - zu verwenden un ddie Stimme so durchzunumerieren. +- `` eine Identifikation der Stimme, sie wird inder `%%score` - + Anweisung referenziert. Es empfiehlt sich hier einfach ganze Zahlen + zu verwenden un die Stimme so durchzunumerieren. - `[clef=]` optionale Angabe des Notenschlüssels. Name ist - `treble` `treble+8` `treble-8` Violinschlüssel (+8 bzw. -8 verschiebt Unterlegnoten um eine Oktave) @@ -1807,7 +1827,7 @@ relevante Beispiele > **Hinweis**: In einigen Konfigurationseinstellungen von Zupfnoter > werden Stimmen über eine Stimmen-Nummer angegeben. Die dabei relevante > Nummerierung der Stimmem ergibt sich aus der Reihenfolge der Stimmen -> in der `%%score` - Anweisung im ABC-Notation (nicht zu verwecheln mit +> in der `%%score` - Anweisung im ABC-Notation (nicht zu verwechseln mit > der Identifikation der Stimme in der `V:` - Zeile. > **Hinweis**: Die ABC-Notation erlaubt mehrere `%%score` - Anweisungen. @@ -1828,8 +1848,8 @@ sollten in folgender Reihenfolge ausgeführt werden. unmotivierten Vorschübe. 2. Synchronisationslinien abschalten (das Feld im Edior löschen oder - '0-1' eintragen). Bei shr vollen Blättern verwirren die - Synchronisationslinene mehr als sie helfen. + '0-1' eintragen). Bei sehr vollen Blättern verwirren die + Synchronisationslinien mehr als sie helfen. 3. im Konfigurationsmenü `Layout` mit den Schnelleinstellungen `layout` `kompakt` bzw. `Packer` `kompakt` die beste Einstellung @@ -1871,7 +1891,7 @@ Häufige Einstellungen bei Zupfnoter sind: Variante Enden. Dies wirkt auch auf die Unterlegnoten - `I:staffnonote 2` - zeigt auch leere Notenlinien in der Notenvorschau -- `I:linewarn 0` - unterdrückt Meldungenüber nicht gefüllte oder zu +- `I:linewarn 0` - unterdrückt Meldungen über nicht gefüllte oder zu volle Zeilen in der Notenvorschau Zupfnoter verwendet von sich aus die folgenden Einstellungen: @@ -1882,6 +1902,66 @@ Zupfnoter verwendet von sich aus die folgenden Einstellungen: I:linewarn 0 I:staffnonote 2 +### Arbeiten mit Dateivorlagen {#filetemplates} + +Erstellt man über das Menü "Neu" ein neues Stück, fügt Zupfnoter eine +Vorlage ein. Standardmäßig ist das die Vorlage für ein vierstimmiges +Stück. Dieses legt auch die Konfiguration an welche in Kapitel +[Praktisches Vorgehen bei der Erstellung von +Auszügen](#bestPracticeExtract) beschrieben ist. + +Wenn man z.B. für eine Notenmappe mehrere Stücke mit ähnlichen +Einstellungen schreiben will, ist es sinnvoll, die eingebaute Vorlage +durch eine projektspezifische Vorlage zu ersetzen, in der schon eineige +Parameter (z.B. Blattbeschriftungen) vorausgefüllt sind. + +Zupfnoter bietet eine experimentelle Unterstützung über die +[Konsole](#konsole-fenster). In folgenden Schritten kann ein eigene +Vorlage eingerichtet werden: + +1. `edittemplate`: Damit wird das aktuelle Template in den Editor + geladen und kann angepasst werden. +2. `editconf template`: Damit werde die Template-spezifischen + Eigenschaften (Dateiname und Titel) eingstellt. + + > **Hinweis**: Man muss von Hand auf den Reiter "Konfiguration" + > schalten um die Konfigurationsmaske zu sehen. + > + > **Hinweis**: mit diesem Befehl kann man auch feststellen, welche + > Vorlage gerade aktiv ist. + +3. `settemplate`: Damit wird der aktuelle Editor-Inhalt als Template + hinterlegt +4. Menüpunkt 'Speichern': Damit wird der Editorinhalt gespeichert. + + > **Hinweis**: Dabei ist es wichtig, dass die Kopfzeile `F:` einen + > Platzhalter - Zeichen `{{` enthält. Dadurch wird im + > "Template_modus" gespeichert, d.h. der Dateiname wird nicht aus + > der `F:` - Zeile entnommen sondern aus `template.filebase` + + > **Hinweis** Beim Bearbeiten des Templates kommt immer wieder die + > Meldung wie + > + > `"{{song_id}}_{{filename}}": Fehlerhafte Zeichen im Filenamen` + > + > Das kommt daher dass die Platzhalter in der Dateivorlage ja nicht + > aufgelöst sind, daher wird die F: - Kopfzeile als fehlerhaft + > markiert. + +Eine Dateivorlage ist eine normale ABC-Datei in der einige Platzhalter +eingefügt sind, welche beim erstellen eines neuen Stückes anhand der +Benutzereingaben aufgelöst bzw. ausgefüllt werden. Folgende Platzhalter +sind verfügbar: + +`{{song_id}}` +: Das ist die Identifikationsnummer des Stückes + +`{{filename}}` +: Das ist die Basis für den Dateinamen + +`{{song_title}}` +: Das ist der Titel des Stückes. + ### Parameter in der Zupfnoter-URL In der Adressleiste des Browsers können Parameter übergeben wreden. Das @@ -1896,7 +1976,7 @@ zur Vollständigkeit aufgeführt. die Flußlinie der Melodiestimme (meist der ersten Stimme) handelt. [^040_UD-Zupfnoter-Referenz.md_2]: Vielleicht gelingt es eines Tages, - ein Verzeichnis diser Kürzel zu erstellen um so Kollisionen zu + ein Verzeichnis dieser Kürzel zu erstellen um so Kollisionen zu vermeiden [^040_UD-Zupfnoter-Referenz.md_3]: Leider gibt es keine entsprechende @@ -1907,7 +1987,7 @@ zur Vollständigkeit aufgeführt. Kapitel \ref{konsole-fenster} [Konsole](#konsole-fenster)). [^040_UD-Zupfnoter-Referenz.md_5]: Das Filter lässt man am besten auf - "Error" eingestellt, nur bei Problembehbungen bzw. Fehlersuche im + "Error" eingestellt, nur bei Problembehebungen bzw. Fehlersuche im Programm sind andere Einstellungen sinnvoll [^040_UD-Zupfnoter-Referenz.md_6]: Zupfnoter kann über die Menüleiste diff --git a/30_sources/UD_Zupfnoter-Handbuch/050_UD_Zupfnoter-einstellungen.md b/30_sources/UD_Zupfnoter-Handbuch/050_UD_Zupfnoter-einstellungen.md index 05a9d1cc..f4541f10 100644 --- a/30_sources/UD_Zupfnoter-Handbuch/050_UD_Zupfnoter-einstellungen.md +++ b/30_sources/UD_Zupfnoter-Handbuch/050_UD_Zupfnoter-einstellungen.md @@ -62,7 +62,7 @@ TODO: text überarbeiten Begleitnoten) [extract.x.synchlines] Diese Einstellung bestimmt, zwischen welchen Stimmen die - Synchronisiationslinien dargestellt werden. + Synchronisationslinien dargestellt werden. **Hinweise:** Synchronisationslinien für Mehrklänge werden immer dargestellt. @@ -73,7 +73,7 @@ TODO: text überarbeiten Überschrift des Musikstückes und der Informationsblock separat positioniert werden. - **Hinweis:** durch Veschieben der Objekte mit der Maus wird diese + **Hinweis:** durch Verschieben der Objekte mit der Maus wird diese Einstellung automatisch eingefügt. - **Liedtexte:** (Liedtexte) [extract.x.lyrics] @@ -140,7 +140,7 @@ spezifischen Konventionen. Diese Zusätze stehen vor der Note bzw. dem Taktstrich auf den sie sich beziehen. Zupfnoter-Annotations beginnen mit einem der Zeichen `:`, `@`, `!`, `#`, -`<`, `>`. Beispielwesie bedeutets `"^>"` dass das Notensymbol in den +`<`, `>`. Beispielsweise bedeutet `"^>"` dass das Notensymbol in den Unterlegnoten nach rechts verschoben werden. > **Hinweis**: Dieses Zusätze können über Bildschirmmasken komfortabel @@ -149,7 +149,7 @@ Unterlegnoten nach rechts verschoben werden. Es gibt folgende Zusätze: -- **`^:`** - Sprungziel: Damit kannst du ein Ziel festelegen zu dem +- **`^:`** - Sprungziel: Damit kannst du ein Ziel festlegen zu dem eine Sprunglinie gezeichnet werden kann. Damit kannst du beliebige Sprünge darstellen. diff --git a/30_sources/UD_Zupfnoter-Handbuch/090_UD_Zupfnoter-Konfiguration.md b/30_sources/UD_Zupfnoter-Handbuch/090_UD_Zupfnoter-Konfiguration.md index e79ff295..1ebe0e54 100644 --- a/30_sources/UD_Zupfnoter-Handbuch/090_UD_Zupfnoter-Konfiguration.md +++ b/30_sources/UD_Zupfnoter-Handbuch/090_UD_Zupfnoter-Konfiguration.md @@ -1529,6 +1529,27 @@ Hier kannst du die Pausenposition vor einer Wiederholung einstellen. "repeatstart": "next" +## `template` - Dateivorlate {#template} + +TODO: Helptext für template einfügen + + "template": {"filebase": "-no-template-", "title": "- no template -"} + + +## `template.filebase` - Dateibasis {#template.filebase} + +TODO: Helptext für template.filebase einfügen + + "filebase": "-no-template-" + + +## `template.title` - Titel {#template.title} + +TODO: Helptext für template.title einfügen + + "title": "- no template -" + + ## `templates` - Vorlagen {#templates} Dieser Parameter kann nicht vom Benutzer gesetzt werden sondern liefert diff --git a/30_sources/UD_Zupfnoter-Handbuch/095_UD_Zupfnoter-Historie.md b/30_sources/UD_Zupfnoter-Handbuch/095_UD_Zupfnoter-Historie.md index 439c2ccf..9b0fec97 100644 --- a/30_sources/UD_Zupfnoter-Handbuch/095_UD_Zupfnoter-Historie.md +++ b/30_sources/UD_Zupfnoter-Handbuch/095_UD_Zupfnoter-Historie.md @@ -91,7 +91,7 @@ - Sektieren von Noten in der Notenvorschau verbessert. - non BWC: Oktavierte Notenschlüssel werden nun beachtet - Schneidemarken werden nur auch bei A4-Ausddruck ausgegeben -- Beschrifungen für Variante Enden werden unterddrückt, wenn keine +- Beschriftungen für Variante Enden werden unterddrückt, wenn keine Sprunglinien ausgegeben werden - Taktnummern und Zählhinweise werden für unterdrückte Pause nicht mehr dargestellt @@ -177,7 +177,7 @@ ### Enhancement -- now we have configuration paramters for printer optimimization \#82 +- now we have configuration parameters for printer optimimization \#82 - now have forms based configuration \#67 - now have forms based editing of snippets (now called addons) \#83 - now have a lyrics editor tab \#8 diff --git a/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_release.pdf b/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_release.pdf index 82e79a53..3a5a20c8 100644 Binary files a/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_release.pdf and b/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_release.pdf differ diff --git a/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_review.latex b/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_review.latex index 5989ce72..7c24b037 100644 --- a/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_review.latex +++ b/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_review.latex @@ -204,7 +204,7 @@ \hyphenation{Zupf-noter} \hyphenation{Fen-ster} -Version 1.7.0 +Version 1.8.0 dev 1 \begin{verbatim} © 2017 https://www.zupfnoter.de @@ -227,7 +227,7 @@ hat. Aber wie sagt man doch so schön: ``keine Panik!''. Ersteller einfacher Unterlegnoten kommen mit den ersten Kapiteln schon auf die Erfolgsstraße. -Dieses Handbuch richtet sich an alle, die Zupfnoter vewenden und sich +Dieses Handbuch richtet sich an alle, die Zupfnoter verwenden und sich selbst in den Zupfnoter einarbeiten wollen. Dabei haben wir folgende Zielgruppen im Blick: @@ -246,17 +246,17 @@ Zielgruppen im Blick: begrenzt. \item \textbf{Lektoren} schreiben nicht selbst im Zupfnoter, sondern - redigieren Noten in Zpufnoter. + redigieren Noten in Zupfnoter. \end{itemize} Dieses Handbuch wurde von Verena Hinzmann und Bernhard Weichel erstellt. \begin{quote} \textbf{Hinweis}: Dieses Handbuch ist noch nicht fertig; Kapitel 5 ff. -sind nur rudimentär. Wir veröffentlichen daher die Voreabversionen mit +sind nur rudimentär. Wir veröffentlichen daher die Vorabversionen mit TODOs und Zeilennummern. -Für Hinweise auf Fehler oder Verbessrungsmöglichkeiten sind wir sehr +Für Hinweise auf Fehler oder Verbesserungsmöglichkeiten sind wir sehr dankbar. \end{quote} @@ -342,7 +342,7 @@ Zupfnoter}\label{erste-schritte-mit-zupfnoter} Mit dem Zupfnoter kannst du ganz schnell einfache Musikstücke eingeben und als Unterlegnoten darstellen. Mit der Zeit wirst du immer mehr -Funktionen und Möglichkeiten von Zufnoter erobern, um auch komplexe +Funktionen und Möglichkeiten von Zupfnoter erobern, um auch komplexe Musikstücke zu bearbeiten bzw. die Unterlegnoten im Detail nach deinen Wünschen zu gestalten. @@ -547,7 +547,7 @@ Schwänzchen in die Höh \needspace{6cm} \begin{quote} - \textbf{Hinseis:} Leerzeichen in den Liedtexten werden komprimiert, + \textbf{Hinweis:} Leerzeichen in den Liedtexten werden komprimiert, d.h. zu einem Leerzeichen zusammengefasst. Leerzeichen am Anfang einer Zeile (führende Leerzeichen) werden ignoriert. Du kannst aber die Ausgabe eines Leerzeichens erzwingen, wenn du die Tilde @@ -578,11 +578,11 @@ Schwänzchen in die Höh \item Klicke auf die Schaltfläche ``Neuer Eintrag'' um einen neuen Liedtextblock hinzuzufügen\footnote{man mag sich fragen, warum - Zupfnoter nicht einen Standard-Liedbock eingebaut hat. Ein solcher - Standard-Liedbock schlägt aber immer wieder durch und macht die + Zupfnoter nicht einen Standard-Liedblock eingebaut hat. Ein solcher + Standard-Liedblock schlägt aber immer wieder durch und macht die inidividuelle Anordnung von Strophen sehr komplex, da man nicht nur die Strophen hinzufügen, sondern auch die Wirkung des - Stnadard-Liedbocks neutralisieren muss.} + Standard-Liedblocks neutralisieren muss.} \item Trage im Feld ``Strophen'' ein: ``\texttt{1,\ 2}'', und bestätige die Eingabe durch Drücken der ``Tab'' - Taste. @@ -682,7 +682,7 @@ Da du aber nicht nur ein Musikstück schreiben willst, solltest du natürlich dein Musikstück auf deinem Rechner so abspeichern, dass du es später wieder laden und weiter bearbeiten kannst. -Zupfnoter bietet dazu zuwei Möglichkeiten: +Zupfnoter bietet dazu zwei Möglichkeiten: \begin{itemize} \itemsep1pt\parskip0pt\parsep0pt @@ -739,7 +739,7 @@ diese weiter zu geben): Wenn du regelmäßig mit Zupfnoter arbeiten willst, bietet es sich an, zum Speichern der Muskstücke die Dropbox zu benutzen. Eine Dropbox ist ein Speicher außerhalb deines Rechners (in der ``Cloud''). Mit der Dropbox -hast du viele Vorteile bei Zupfbnoter: +hast du viele Vorteile bei Zupfnoter: \begin{itemize} \item @@ -787,7 +787,7 @@ pro verwendetem Browser} mit diesem Dropbox-Konto verbinden: \textgreater{} Einloggen'' \item es erscheint der Zupfnoter - Dialog ``Einloggen'' - gib dort bitte ein - Verezeichnis aus deiner Dropbox ein, in welcher du dein Musikstück + Verzeichnis aus deiner Dropbox ein, in welcher du dein Musikstück speichern möchtest \begin{quote} @@ -844,7 +844,7 @@ pro verwendetem Browser} mit diesem Dropbox-Konto verbinden: Auszüge als PDF-Dateien in deiner Dropbox zu speichern. \begin{quote} - \textbf{HInweis}: Zupfnoter speichert in dem Verzeichnis, welches beim + \textbf{Hinweis}: Zupfnoter speichert in dem Verzeichnis, welches beim Einloggen angegeben wurde. Fall das Verzeichnis nicht existiert, wird es angelegt. Bitte achte auf also die richtige Schreibweise \end{quote} @@ -878,7 +878,7 @@ Zupfnoter verwendet jedoch nur folgende Dateitypen in deiner Dropbox: Modus'' des Browsers zu arbeiten. \item Dropbox-Anwendungen speichern ein geheime Zeichenkette (auch - ``Accesstoken'' genannt) auf deineme lokalen Rechner. Wenn du + ``Accesstoken'' genannt) auf deinem lokalen Rechner. Wenn du vermutest, das dieses Token kompromittiert wurde, kannst du auf der Website von Dropbox die Verbindung zu Zupfnoter löschen. Dadurch wird bei der nächsten Anmeldung ein neues Token erzeugt. @@ -901,7 +901,7 @@ Zupfnoter verwendet jedoch nur folgende Dateitypen in deiner Dropbox: laden}\label{musikstuxfcck-aus-dropbox-laden} Um das Musikstück wieder zu laden, klicke auf ``Öffnen'' bzw. wähle das -Menü ``Dropbox \textgreater{} Öfnnen''. Es erscheint ein +Menü ``Dropbox \textgreater{} Öffnen''. Es erscheint ein Datei-Auswahl-Dialog von Dropbox. Dort ist oben ein Suchfeld. Dort kannst du einen Teil des Dateinamens eingeben, um die gewünschte Datei zu suchen. @@ -1024,7 +1024,7 @@ ABC-Notation: Kapitel~\ref{masken-fuer-zusaetze}~\hyperref[masken-fuer-zusaetze]{Zusätze}). \item \textbf{Konfiguration} der Unterlegnoten: Zupfnoter gewinnt seine - Leistungsfähigkit und \index{Konfiguration} Flexibilität durch + Leistungsfähigkeit und \index{Konfiguration} Flexibilität durch vielfältige Einstellmöglichkeiten - genannt Konfigurationsparameter. Diese Konfigurationsparameter wirken auf die Erstellung der Unterlegnotenblätter und steuern z.B: @@ -1032,8 +1032,8 @@ ABC-Notation: \begin{itemize} \itemsep1pt\parskip0pt\parsep0pt \item - Stimmen, die ausgegeben werden; Stimmen durch - Synchronisiationslinien verbunden werden usw. + Stimmen, die ausgegeben werden; Stimmen durch Synchronisationslinien + verbunden werden usw. \item Größe von Notenelementen, Liniendicken \item @@ -1088,7 +1088,7 @@ verwendet. In der ABC-Notation wird in den Kopfzeilen ein Standardnotenwert angegeben, z.B. \texttt{L:1/4}. Dies bedeutet, daß standardmäßig in Viertelnoten erfasst wird. Ausgehend von diesem Wert ergibt sich der -Notenwert duch Multiplikation mit der angegebenen Länge. Diese +Notenwert durch Multiplikation mit der angegebenen Länge. Diese Längenangaben wird an den Notennamen angehängt. TODO:\marginpar{TODO} verweise auf ABC-Kapitel @@ -1217,7 +1217,7 @@ man sie ``notenbezogene Elemente'': verwendet werden. Ein Tuplet entsteht, wenn in der ABC-Notation den Noten der Tuplets - eine Klammer mit der Länge des Tupletes vorangestellt wird, z.B: + eine Klammer mit der Länge des Tuplets vorangestellt wird, z.B: ``\texttt{(3CCC}''. \item \textbf{(23) tie - Haltebogen}: Ein Haltebogen verbindet zwei Noten @@ -1260,9 +1260,9 @@ man sie ``notenbezogene Elemente'': \begin{quote} \textbf{Hinweis:} Die Aufteilung in Abschnitte gilt für das gesamte - Musikstück. daher muss die Bezeichung von Abschnitten in der + Musikstück. daher muss die Bezeichnung von Abschnitten in der \textbf{ersten Stimme} erfolgen. Sie wirkt dann auf alle Stimmen. - Abschnittsbezeichungen in den folgenden Stimmen werden ignoriert. + Abschnittsbezeichnungen in den folgenden Stimmen werden ignoriert. \end{quote} \item \textbf{(28) countnotes - Zählhilfen}: Zupfnoter kann die Noten @@ -1273,7 +1273,7 @@ man sie ``notenbezogene Elemente'': \begin{quote} \textbf{Hinweis} die Zählhilfen sind so gesataltet, dass man während - des Spields die Zeitachse durchzählt. Bei Noten mit mehreren Schlägen + des Spiels die Zeitachse durchzählt. Bei Noten mit mehreren Schlägen beginnt die Zählhilfe immer mit der Nummer des ersten Schlages (z.B. 2-3 ist eine Note, die bei Schlag 2 beginnt und zwei Schläge lang gespielt wird, d.h. während diese Note klingt, zählt man 2 - 3) @@ -1281,7 +1281,7 @@ man sie ``notenbezogene Elemente'': \item \textbf{(29) barnumbers - Taktnummer}: Zupfnoter kann die Takte automatisch durchnummerieren. Damit kann bei gemeinsamem Spiel auch - mitten im Musikstück wieder eingesetz werden. Diese Ausgabe ist + mitten im Musikstück wieder eingesetzt werden. Diese Ausgabe ist konfigurationsabhängig (\texttt{extract.0.barnumbers}. \item \textbf{(30) decoration - Dekoration}: Zupfnoter kann einzelne @@ -1298,7 +1298,7 @@ gibt es folgende Elemente: \begin{itemize} \item - \textbf{(25) jumpline for repeat - Sprungline für Wiederholungen}: + \textbf{(25) jumpline for repeat - Sprunglinie für Wiederholungen}: Eine Wiederholung entsteht durch Beifügen eines Doppelpunktes an die Taktstriche in der ABC-Notation z.B. ``\texttt{\textbar{}:\ C4\ :\textbar{}}''. @@ -1320,7 +1320,7 @@ gibt es folgende Elemente: nur korrekt, wenn es sich um die Flußlinie der Melodiestimme (meist der ersten Stimme) handelt.} verbindet die Noten \textbf{einer} Stimme und markiert so die Führung innerhalb dieser \textbf{einen} - Stimme. Standardmäßig stellt Zupfnoter die Flußline in der ersten und + Stimme. Standardmäßig stellt Zupfnoter die Flußlinie in der ersten und dritten Stimme dar. Die Ausgabe von Flusslinien für die einzelnen Stimmen hängt von der @@ -1375,17 +1375,17 @@ gibt es folgende Elemente: \textbf{Hinweis}: Wenn die Varianten am Ende einer Wiederholung stehen, entfällt die Ausgangslinie. Stattdessen wird eine normale \textbf{(25) Sprunglinie für Wiederholung} verwendet. Die - Positionsangabe der Ausganslinie wird in diesem Fall ignoriert und - die Positionsangabe der Sprunglinie am Ender der Wiederholung + Positionsangabe der Ausgangslinie wird in diesem Fall ignoriert und + die Positionsangabe der Sprunglinie am Ende der Wiederholung verwendet. \end{quote} \item \textbf{(53) Folgelinie} ist die Ausgangslinie der letzten - Variation. Diese kann separat positioniert werden, um das gwünschte + Variation. Diese kann separat positioniert werden, um das gewünschte Notenbild zu erreichen. \end{itemize} - Die Positionen deieser Linien werden als Zusatz vor den Taktstrich der + Die Positionen dieser Linien werden als Zusatz vor den Taktstrich der ersten Variation geschrieben (Schaltfläche ``Zusatz einfügen'' bzw. ``Zusatz bearbeiten''). @@ -1393,13 +1393,13 @@ gibt es folgende Elemente: \textbf{Hinweis:} Ab Zupfnoter 1.7 können diese Linien mit der Maus verschoben werden. Diese Verschiebungen werden in der Konfiguration gespeichert und von älteren Zupfnoter-Versionen nicht verarbeitet. Die - Konfiguration über Zusaätze ist aus Kompatibilitätsgründen noch + Konfiguration über Zusätze ist aus Kompatibilitätsgründen noch vorhanden. \end{quote} \begin{quote} \textbf{Hinweis:} Zupfnoter stellt die Noten der verschiedenen - Variationen in unterschiedlicen Grautönen dar. Die Farben können in + Variationen in unterschiedlichen Grautönen dar. Die Farben können in der Konfigurationsmaske \texttt{Layout} über eine Schnelleinstellung ausgewählt werden (siehe Konfiguration \hyperref[extract.0.layout.color]{extract.x.layout.color}). @@ -1467,17 +1467,17 @@ W: Strophe 2 Zeile 2 \end{quote} \begin{quote} - \textbf{Hinweis}: In der ABC-Notation kann man Liedtexte mit sowhohl + \textbf{Hinweis}: In der ABC-Notation kann man Liedtexte mit sowohl mit Kopfzeile \texttt{W:}(Großbuchstaben) als auch mit Kopfzeile - \texttt{w:} (Kleionbuchstaben) eingeben. Die Variante mot - Kleinbuchstaben wird verwendet, um die Lietexte direkt in die - Notensyteme zu schreiben. Zupfnoter ignoriert diese Liedtexte in den + \texttt{w:} (Kleinbuchstaben) eingeben. Die Variante mit + Kleinbuchstaben wird verwendet, um die Liedtexte direkt in die + Notensysteme zu schreiben. Zupfnoter ignoriert diese Liedtexte in den Notenlinien \end{quote} \begin{quote} \textbf{Hinweis}: Auch wenn die ABC-Notation es erlaubt, die - Kopfzeilen \texttt{W:} im ganezn ABC-Text zu verteilen ist es wichtig, + Kopfzeilen \texttt{W:} im ganzen ABC-Text zu verteilen ist es wichtig, die Liedtexte dennoch in einem Block zusammenzufassen. Sonst meldet Zupfnoter, dass es mehrere Liedtexte gibt. Der Editor fasst sie alle zusammen, löscht aber die anderen Blöcke nicht. Das muss manuell @@ -1486,10 +1486,10 @@ W: Strophe 2 Zeile 2 \begin{quote} \textbf{Hinweis}: Zupfnoter ignoriert Leerzeichen am Anfang von - Liedtexten. Macnhmal möchte man aber den Liedtext in bestimmten Zeilen + Liedtexten. Manchmal möchte man aber den Liedtext in bestimmten Zeilen etwas einrücken um den Text um eine Note im Unterlegnotenblatt - herumfließen zu lassen. Wenn aleo eine Textzeile mit einer Reihe Tilde - (\texttt{\textasciitilde{}}) - Zeichen beginnt werden diese in den + herumfließen zu lassen. Wenn also eine Textzeile mit einer Reihe Tilde + (\texttt{\textasciitilde{}}) - Zeichen beginnt, werden diese in den Unterlegnoten als Leerraum ausgegeben und so der Textbeginn nach rechts verschoben. \end{quote} @@ -1591,8 +1591,8 @@ Unterlegnoten}\label{elemente-zur-organisation-von-unterlegnoten} \subsubsection{Vordefinierte Blattbeschriftungen}\label{vordefinierte-blattbeschriftungen} -Zupfnoter bietet eine Reihe von Vorlagen für die Seitenbeschrifungen. -Damit lässt sich ein einheitliches Vorgehen bei der Beschrifung der +Zupfnoter bietet eine Reihe von Vorlagen für die Seitenbeschriftungen. +Damit lässt sich ein einheitliches Vorgehen bei der Beschriftung der Unterlegnoten erreichen. Diese können in der Konfigurationsmaske ``Seitenbeschriftung'' eingegeben werden. Zupfnoter hat geeignete Vorgabewerte für die Position und Schriftart dieser Beschriftungen. @@ -1645,7 +1645,7 @@ Vorgabewerte für die Position und Schriftart dieser Beschriftungen. \item \texttt{XXX} ist ein Kürzel für den Herausgeber, z.B. RBW für Ruth und Bernhard Weichel, ZNR - für Zupfnoter \footnote{Vielleicht - gelingt es eines Tages, ein Verzeichnis diser Kürzel zu erstellen + gelingt es eines Tages, ein Verzeichnis dieser Kürzel zu erstellen um so Kollisionen zu vermeiden} \item \texttt{999} eine Nummer für das Blatt @@ -1691,7 +1691,7 @@ unterscheiden. Daher wird hier noch einmal eine Zusammenfassung gegeben: \ref{annotations} \hyperref[annotations]{annotations} \index{Notenbeschriftungsvorlage} mit Positionsangabe anlegen und über einen Zusatz (Schaltfläche ``Ref. Notenbeschriftung'') daraus eine - Notenbeschrifung erstellen. + Notenbeschriftung erstellen. \begin{quote} \textbf{Hinweis}: Zupfnoter kennt standardmäßig die @@ -1777,7 +1777,7 @@ Zupfnoter kennt drei Fenster\footnote{Es gibt noch ein weiteres Fenster, \item \texttt{ABC}- Der Texteditor für die ABC-Notation \item - \texttt{Liedtextexte} für die Erfassung der Liedtexte + \texttt{Liedtexte} für die Erfassung der Liedtexte \item \texttt{Konfiguration} für die formulargeführte Bearbeitung der Zupfnoter-Konfiguration. @@ -1785,7 +1785,7 @@ Zupfnoter kennt drei Fenster\footnote{Es gibt noch ein weiteres Fenster, \item Im \textbf{rechten oberen Fenster} (Kapitel \ref{notenvorschau} \hyperref[notenvorschau]{Eingabe}) wird in der herkömmlichen - Notenschrift das Musikstück gezeigt, und kann somit musikallisch + Notenschrift das Musikstück gezeigt, und kann somit musikalisch überprüft wreden. Die Darstellung in herkömmlicher Notenschrift kann mehrstimmig @@ -1808,13 +1808,13 @@ Zupfnoter kennt drei Fenster\footnote{Es gibt noch ein weiteres Fenster, Die Anordnung dieser Fenster ist in Zupfnoter fest vorgegeben. Man kann aber während der Arbeit folgende Einstellungen vornehmen, um den -aktuellen Arbeitsschrit besser zu unterstützen: +aktuellen Arbeitsschritt besser zu unterstützen: \begin{itemize} \itemsep1pt\parskip0pt\parsep0pt \item Fenstergröße verstellen: Die Trennlinien zwischen den Fenstern können - mit der MAus verschoben werden, um Platz für die aktuell wichtigen + mit der Maus verschoben werden, um Platz für die aktuell wichtigen Elemente zu schaffen \item Über das Menü \textbf{``\texttt{Ansicht}''} kann man einzelne Fenster @@ -1845,14 +1845,14 @@ eingeben}). \begin{quote} \textbf{Hinweis}: Der Begriff ``Fenster'' wird sowohl für die Fenster -des Betriebssytems als auch die Fenster innerhalb Zupfnoter verwendet. +des Betriebssystems als auch die Fenster innerhalb Zupfnoter verwendet. \end{quote} \hyperdef{}{menues-im-hauptfenster}{\subsubsection{Werkzeugleiste für Schaltflächen und Menüs}\label{menues-im-hauptfenster}} Die Zupfnoter - Werkzeugleiste ist immer sichtbar (also auch in allen -Ansichten) und ersteckt sich über aller Fenster. In ihr befinden sich +Ansichten) und erstreckt sich über aller Fenster. In ihr befinden sich Schaltflächen und Menüs die man während der Erstellung von Unterlegnoten benötigt. Nach einem Klick auf die Schaltflächen führt der Zupfnoter bestimmte Aktivitäten aus. @@ -1862,7 +1862,7 @@ erreichbar (siehe Kapitel \ref{shortcuts} \hyperref[shortcuts]{Shortcuts}) \begin{quote} -\textbf{Hinweis}: Für die Vesrion 1.5 wird die Bedienungsoberfläche von +\textbf{Hinweis}: Für die Version 1.5 wird die Bedienungsoberfläche von Zupfnoter verbessert. Daher sind die Informationen in diesem Kapitel vorläufig. \end{quote} @@ -1937,9 +1937,9 @@ vorläufig. aber auch dann muss sie über den Browser gedruckt werden. \begin{quote} - \textbf{Hinweis}: Wenn du eine PDF - Datei davon haben möchest, + \textbf{Hinweis}: Wenn du eine PDF - Datei davon haben möchtest, musst diese mit ``Bordmitteln'' deines PC erstellen. Du kannst auch - eines der gänigen ABC-Programme verwenden (z.B. Easy-ABC) um die + eines der gängigen ABC-Programme verwenden (z.B. Easy-ABC) um die Noten zu drucken. \end{quote} \end{itemize} @@ -1953,14 +1953,14 @@ vorläufig. \item Die Einstellung \textbf{Alle Fenster} ist der Standardbildschirmaufbau mit allen drei Fenstern (Eingabe, - herkömmliche Noten, Unterlegnoten). In dieser Enstellung wird + herkömmliche Noten, Unterlegnoten). In dieser Einstellung wird meistens gearbeitet, weil man eine schnelle Rückmeldung zu den Ergebnissen hat. \item - Die Einstellung \textbf{Noteneingabe} zeigt das Eingebaefenster + Die Einstellung \textbf{Noteneingabe} zeigt das Eingabefenster (linkes Fenster) und die Notenvorschau (Fenster rechts oben). Diese Einstellung ist hilfreich, wenn man sich zunächst auf die reine - Eingabe des Muskstücks konzentrieren will. + Eingabe des Musikstücks konzentrieren will. \item Die Einstellung \textbf{Harfeneingabe} zeigt das Eingabefenster (linkes Fenster) und die Harfennotenvorschau (Fenster rechts unten). @@ -1977,7 +1977,7 @@ vorläufig. \end{quote} \item Mit der Einstellung \textbf{Harfennoten} (Harfe) sieht man nur eine - Vorschau der Unterlegnoten. Diese Einstellugn ist hilfreich zur + Vorschau der Unterlegnoten. Diese Einstellung ist hilfreich zur endgültigen Prüfung der erstellten Unterlegnoten z.B. durch einen Lektor. @@ -2010,14 +2010,14 @@ vorläufig. der 3.ten und 4.ten Stimme dienen. TODO:\marginpar{TODO} Überarbeiten nach Verbesserung der Bedienung von - Auszuügen. + Auszügen. \item Schaltfläche \textbf{Rendern} (umwandeln): (alternativ Tastenkombination \texttt{cmd/ctrl\ -\ R} bzw. \texttt{cmd/ctrl\ -\ RETURN}. Mit Klick auf diese Schaltfläche werden die Ansicht der Unterlegnoten - und die Fehlermeldungen im Texteditor des Eingebefensters + und die Fehlermeldungen im Texteditor des Eingabefensters aktualisiert. \begin{quote} @@ -2040,7 +2040,7 @@ vorläufig. kombiniert werden (z.B. nur Sopran und Alt). \item wenn mehrere Noten selektiert sind, spielt Zupfnoter nur genau die - selektierten Noten. Damit kann man eine Detailkontrolle errreichen. + selektierten Noten. Damit kann man eine Detailkontrolle erreichen. \end{itemize} \begin{quote} @@ -2066,7 +2066,7 @@ vorläufig. \begin{quote} \textbf{Hinweis}': Über das Hilfe Menü kann man auch Beispiele aufrufen. Diese öffnen ein neues Zupfnoter-Fenster im Demo - Modus. In - desem Modus kann man nicht speichern oder öffen. Die entprschenden + desem Modus kann man nicht speichern oder öffnen. Die entsprechenden Menüpunkte sind inaktiv. Der aktuelle Modus wird in der Statuszeile angezeigt. @@ -2075,7 +2075,7 @@ vorläufig. \subsubsection{Fenster links: Eingabe}\label{eingabefenster} -Das Eingeabefenster enthält seinerseits +Das Eingabefenster enthält seinerseits \begin{itemize} \itemsep1pt\parskip0pt\parsep0pt @@ -2104,7 +2104,7 @@ des Eingabefensters}\label{werkzeugleiste-des-eingabefensters}} sie in der Konfiguration noch nicht vorhanden sind. Die Werte der eingefügten Parameter können dann über die - Konfigurationsmaken oder im Texteditor geändert werden. + Konfigurationsmasken oder im Texteditor geändert werden. \end{quote} Die Reihenfolge der Menüpunkte entspricht der Bearbeitungsabfolge, @@ -2149,8 +2149,8 @@ des Eingabefensters}\label{werkzeugleiste-des-eingabefensters}} Position von Sprunglinien anzugeben oder notengebundene Anmerkungen zu erfassen. Diese Zusätze sind an eine Note bzw. an einen Taktstrich gebunden und werden in Form einer ABC-Anmerkung notiert - (z.B.\texttt{"\^{}@@3"\ :\textbar{}} für die Lage einer Sprungline für - eine Wiederholung). + (z.B.\texttt{"\^{}@@3"\ :\textbar{}} für die Lage einer Sprunglinie + für eine Wiederholung). \begin{quote} \textbf{Hinweis}: Dieses Menü wird daher erst dann aktiv, wenn die @@ -2168,7 +2168,7 @@ des Eingabefensters}\label{werkzeugleiste-des-eingabefensters}} \item Schaltfläche \textbf{Zusatz bearbeiten} - Über diese Schalzfläche kann man die Bearbeitungsmasken für vorhandene + Über diese Schaltfläche kann man die Bearbeitungsmasken für vorhandene Zusätze erneut aufrufen. \begin{quote} @@ -2215,7 +2215,7 @@ Texteditor der Eingabe und in der Unterlegnotenvorschau hervorgehoben. \textbf{Hinweis::} Wenn man zunächst eine Note anklickt, und dann mit gedrückter ``Shift''-Taste (``Umschalttaste'') eine zweite Note anklickt, dann werden die dazwischen liegenden Noten selektiert. Damit -kannst du z.B. einen Auschnitt aus einer bestimmten Stimme über die +kannst du z.B. einen Ausschnitt aus einer bestimmten Stimme über die Notenvorschau auswählen und anschließend abspielen lassen. \end{quote} @@ -2260,14 +2260,14 @@ Einträgen Aktiver Filter für Meldungen in der Konsole (Loglevel). Das Filter kann über deen Eingebbefehl\texttt{loglevel\ error} in der Konsole umgestellt werden \footnote{Das Filter lässt man am besten auf - ``Error'' eingestellt, nur bei Problembehbungen bzw. Fehlersuche im + ``Error'' eingestellt, nur bei Problembehebungen bzw. Fehlersuche im Programm sind andere Einstellungen sinnvoll}. \item Aktueller Modus von Zupfnoter. Hier gibt es \texttt{work} und \texttt{demo}. im Demo-Modus sind einge Menüpunkte nicht aktiv. \item Name des Konfigurationsparameters für das Element unter dem Mauszeiger - falls dieses mit der Maus veschoben werden kann oder über das + falls dieses mit der Maus verschoben werden kann oder über das Kontext-Menü konfiguriert werden kann. \end{itemize} @@ -2289,63 +2289,87 @@ Andererseits gibt es gerade in der Konsole manche experimentelle Zusatzfunktion, die noch nicht an die grafische Oberfläche angeschlossen ist. +Folgende Befehle zum Arbeiten mit voreingestellen Auszügen bzw. +Beschriftungen + \begin{itemize} -\itemsep1pt\parskip0pt\parsep0pt \item \texttt{setstdnotes}: kopiert dem aktuellen Stück die Konfiguration der Blattbeschriftungen usw um sie auf ein anderes Stück zu übertragen. \item \texttt{stdnotes}: überträgt die zuletzt kopierte Konfiguration der - Blattbeschriftungen auf das aktuelle Stück -\item - \texttt{stdectract}: überträgt die zuletzt kopierte Konfiguration der - Auszüge auf das aktuelle Stück + Blattbeschriftungen auf das aktuelle Stück in den aktuellen Auszug. \item \texttt{setstdextract}: kopiert aus dem aktuellen Stück die Konfiguration der Auszüge, um sie auf ein anderes Stück zu übertragen. +\item + \texttt{stdectract}: überträgt die zuletzt kopierte Konfiguration der + Auszüge auf das aktuelle Stück + + \begin{quote} + \textbf{Hinweis}: Diese Befehle sind hilfreich um schnell die + Konfiguration eines aus MusicXml importierten Stückes einzustellen. + \end{quote} \end{itemize} -\begin{quote} -\textbf{Hinweis}: Diese Befehle sind hilfreich um schnell die -Konfiguration eines aus MusicXml importierten Stückes einzustellen. -\end{quote} +Über folgende Befehle können Flußlinien gestaltet werden: \begin{itemize} -\itemsep1pt\parskip0pt\parsep0pt \item \texttt{setsetting\ flowconf\ edit}: Mit dieser Einstellung werden die - Flußlinen bearbeitbar, d.h. man kann die Flußlininen mit der Maus + Flußlinien bearbeitbar, d.h. man kann die Flußlinien mit der Maus verformen, (sozusagen verbiegen). \item \texttt{setsetting\ flowconf\ none}: Mit dieser Einstellung werden die Flußlinien nicht mehr bearbeitbar. Bearbeitete Flußlinien bleiben weiterhin ``verbogen''. + + \begin{quote} + \textbf{Hinweis:} Wenn die Bearbeitung der Flußlinien eingeschaltet + ist, wird Zupfnoter deutlich langsamer. Daher wird diese Einstellung + beim Neuladen von Zupfnoter zurückgesetzt. + \end{quote} \end{itemize} -\begin{quote} -\textbf{Hinweis:} Wenn die Bearbeitung der Flußlinien eingeschaltet ist, -wird Zupfnoter deutlich langsamer. Daher wird diese Einstellung beim -Neuladen von Zupfnoter zurückgesetzt. -\end{quote} +Selbst wenn Zupfnoter die Eingabe fehlerhafter Konfigurationsparameter +eigentlich verhindern soll, so kann es trotzdem vorkommen. Wenn also +schwer verständliche Meldungen erscheinen kann man eine erweiterte +Prüfung der Konfigurationsparameter vornehmen: \begin{itemize} -\itemsep1pt\parskip0pt\parsep0pt \item \texttt{setsetting\ validate\ true}: Diese Einstellung bewirkt eine - extra Prüfung/Validierung der Konfigurationsparamter. + extra Prüfung/Validierung der Konfigurationsparameter. \item \texttt{setsetting\ validate\ false}: Diese Einstellung beendet eine - extra Prüfung/Validierung der Konfigurationsparamter. + extra Prüfung/Validierung der Konfigurationsparameter. \item \texttt{editconf\ errors}: Damit werden die fehlerhaften Konfigurationsparameter in den Konfigurationseditor geladen. + + \begin{quote} + \textbf{Hinweis:} Diese Prüfungen sind noch nicht ausgereift und daher + standardmässig ausgeschaltet. Auch zeigt der Editor noch nicht die + Fehler noch nicht genau genug an. + \end{quote} +\end{itemize} + +Folgende Befehle sind für die Arbeit mit Dateivorlagen: + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + \texttt{editconf\ template}: Damit kann man die Eigenschaften für ein + File-Template einstellen. Im Wesentlichen ist das der Dateiname. +\item + \texttt{edittemplate}: Damit wird die aktuelle Dateivorlage zur + Bearbeitung geladen () \end{itemize} \begin{quote} -\textbf{Hinweis:} Diese Prüfungen sind noch nicht ausgereift und daher -standardmässig ausgeschaltet. Auch zeigt der Editor noch nicht die -Fehler noch nicht genau genug an. +\textbf{Hinweis:} Weitere Informationen hierzu siehe +\hyperref[filetemplates]{Arbeiten mit Dateivorlagen} \end{quote} Weiterhin zeigt die Konsole einige Meldungen, die für die Fehleranalyse @@ -2366,7 +2390,7 @@ ist. Die Konsole kann auch für eine bessere Fehlersuche in der Konfiguration verwendet werden. Selbst wenn Zupfnoter die Eingabe fehlerhafter -Konfigurationsparamert eigentlich verhindern soll, so kann es trotzdem +Konfigurationsparameter eigentlich verhindern soll, so kann es trotzdem vorkommen. Wenn also schwer verständliche Meldungen erscheinen kann man den loglevel debug einschalten. Dann kann man in der Konsole mit @@ -2460,13 +2484,13 @@ Eingabemöglichkeiten nutze: \hyperdef{}{texteditor}{\subsubsection{Erfassung der ABC-Notation im Texteditor}\label{texteditor}} -Im Teexteditor kannst du die ABC-Notation bearbeiten. Darüberhinaus +Im Texteditor kannst du die ABC-Notation bearbeiten. Darüberhinaus kannst du die Konfigurationsparameter sehen und ggf. direkt (d.h. ohne Bildschirmmasken) sehen und ggf. korrigieren (für Experten). Im Texteditor kannst du die ABC-Notation erfassen. Elemente werden -entsprechend ihrer Bedetung farblich hervorgehoben (Syntax-Coloring). In -der Statusleiste links unten zeigt Zupfnoter auch Hinweise über die +entsprechend ihrer Bedeutung farblich hervorgehoben (Syntax-Coloring). +In der Statusleiste links unten zeigt Zupfnoter auch Hinweise über die Bedeutung des Elementes links von der aktuellen Schreibmarke an. \begin{quote} @@ -2511,8 +2535,8 @@ dies von Zupfnoter ignoriert. \begin{quote} \textbf{Hinweis}: Auch wenn der Texteditor die Zusätze, die Liedtexte -und die Konfigurationsparamter anzeigt ist es doch besser, die -grafischen Barbeitungsmöglichnkeiten zu nutzen: +und die Konfigurationsparameter anzeigt ist es doch besser, die +grafischen Barbeitungsmöglichkeiten zu nutzen: \begin{itemize} \itemsep1pt\parskip0pt\parsep0pt @@ -2695,7 +2719,7 @@ Parameter je eine Zeile mit den folgenden Elementen: \begin{itemize} \item - \texttt{Löschen} - Löscht den Paramter aus der Konfiguration + \texttt{Löschen} - Löscht den Parameter aus der Konfiguration \begin{quote} \textbf{Hinweis}: Diese Taste kann ggf. einen ganzen Auszug löschen @@ -2717,7 +2741,7 @@ Parameter je eine Zeile mit den folgenden Elementen: \texttt{Hilfe} - zeigt eine spezifische Hilfe für diesen Parameter an \item \texttt{aktuell\ wirksamer\ Wert} - zeigt den Wert an, der für den - Paramter gerade gültig ist. + Parameter gerade gültig ist. \begin{quote} \textbf{Hinweis}: Hier wird ggf. der Wert aus \texttt{extract.0} @@ -2752,13 +2776,13 @@ Für die Bedienung der Masken ist noch wichtig notwendigWenn der Konfigurationsparameer außerhalb der Maske geändert wird (z.B. im Texteditor). \item - Schalltfläche \texttt{Neuer\ Eintrag}: Diese Taste fügt eine neue + Schaltfläche \texttt{Neuer\ Eintrag}: Diese Taste fügt eine neue Instanz eines Parameters ein. Sie ist nur aktiv, wenn es für einen Parameter mehrere Instanzen geben kann (z.B. \index{Liedtexte}Liedtexte {[}lyrics.x{]}, - \index{Seitenbeschriftung}Seitenbeschrifung {[}notes.x{]}) + \index{Seitenbeschriftung}Seitenbeschriftung {[}notes.x{]}) \item - Schalltfläche \texttt{Schnelleinstellungen}: Diese Taste öffnet ein + Schaltfläche \texttt{Schnelleinstellungen}: Diese Taste öffnet ein Menü, aus dem du für die aktuelle Maske eine Voreinstellung auswählen kannst. Eine solche Voreinstellung ist eine sinnvolle Kombination von Parametern für einen bestimmten Fall (z.B. für ein ``kompaktes @@ -2806,8 +2830,8 @@ Eingabefensters}). \textbf{Hinweis}: Der Aufruf von ``Zusatz einfügen'' und ``Zusatz bearbeiten'' liegt auf unterschiedlichen Schaltflächen, da beim ``Einfügen'' ein Menü erscheint über welches ausgewählt wird, ``was'' -eingefügt weden soll. Beim Bearbeiten ist diese Auswahl nicht mehr -notwendig. Daher wird ``bearbeiten'' über eine Schaltflcähe direkt +eingefügt werden soll. Beim Bearbeiten ist diese Auswahl nicht mehr +notwendig. Daher wird ``bearbeiten'' über eine Schaltfläche direkt aufgerufen. \end{quote} @@ -2842,7 +2866,7 @@ Unterlegnotenblatt betreffen, lassen sich auch mit der Maus vornehmen: \item Gestalt der Triolenbogen (Tuplet) \item - Gestalt der Flußlinien (experminetell) + Gestalt der Flußlinien (experimentell) \end{itemize} Für die grundsätzliche Bedienung gilt: @@ -2852,13 +2876,13 @@ Für die grundsätzliche Bedienung gilt: \item Wenn du den Mauszeiger über ein solches Element bewegst, ändert dieser seine Form. Darüber hinaus zeigt die Statusleiste rechts unten, - welcher Konfigurationsparamter verwändert wird. + welcher Konfigurationsparameter verändert wird. \item Bei solchen Elementen ruft das Kontextmenü \textbf{\texttt{Edit\ config}} den entsprechenden Konfigurationseditor auf. \item - Nach dem Beargbeiten des Elementes mit der Maus wird das Element rot. + Nach dem Bearbeiten des Elementes mit der Maus wird das Element rot. Bitte führe einen ``Render'' aus um die Unterlegnotenvorschau zu aktualisieren. \end{itemize} @@ -2883,13 +2907,13 @@ gelöschten Anmerkung verschoben. mehr genutzte Konfigurationen übrig bleiben. Diese werden nicht entfernt und könnten später zu unerwarteten Effekten führen. In diesem Fall ist es am besten mit der rechten Maustaste in der Harfennotenvorschau die -entpreschende Konfiguration auzurufen, zu löschen und neu zu erstellen. +entsprechende Konfiguration aufzurufen, zu löschen und neu zu erstellen. \end{quote} \subsubsection{Texte verschieben}\label{texte-verschieben} Du kannst Titel, Legende, Notenbeschriftungen, Blattbeschriftungen, -Taktnummern, Zählhinweise, Variatnenbezeichenr, Bezeichner von Parts mit +Taktnummern, Zählhinweise, Variantenbezeichner, Bezeichner von Parts mit der Maus verschieben. \subsubsection{Sprunglinien verschieben}\label{sprunglinien-verschieben} @@ -2901,7 +2925,7 @@ Linen rasten beim ziehen mit der Maus zwischen den Saiten ein. \textbf{Hinweis}: Bei varianten Enden wirkt der selbe Konfigurationsparameter ggf. auf mehrere Sprunglinien. Bitte drücke daher auf \texttt{Render} um das Endergebnis zu sehen. Danach sind auch -die Pfeile an den Sprunglineine wieder korrekt. +die Pfeile an den Sprunglinien wieder korrekt. \end{quote} \subsubsection{Triolenbogen gestalten}\label{triolenbogen-gestalten} @@ -2916,16 +2940,16 @@ zu bieten hat :-). Aber mit der Maus geht es ganz einfach: \item wenn man genau hinschaut, dann siehst du an den Triolenbögen zwei kleine Griffe. Wenn du die Maus darüber bewegst, kann due diese mit - gedrückter Maustaste bwegegen. + gedrückter Maustaste bewegen. \item wenn du die Maus bewegst, ändert sich das Bild zu einem Trapez. Der - entstezende Bogen wird durch zwei Kontrolpunkte (die oberen Ecken des + entstehende Bogen wird durch zwei Kontrollpunkte (die oberen Ecken des Trapezes) gestaltet. Im vorstehenden Bild wurde der linke Griff (d.h. der linke Kontrollpunkt) bewegt. \end{itemize} \begin{quote} -\textbf{Hinweis}: Am besgten experimentierst du ein bisschen, um +\textbf{Hinweis}: Am besten experimentierst du ein bisschen, um Erfahrung zu sammeln. Es würde zu weit führen, hier alle Möglichkeiten darzustellen. \end{quote} @@ -2935,7 +2959,7 @@ darzustellen. und daher mit der Maus nicht erreichbar sind. In diesem Fall kannst du an der Triolenbeschriftung oder an einem andere Griff \texttt{Edit\ Cconfig} aufrufen und den Kontrollpunkt so ändern, dass er -wireder sichtbar wird. +wieder sichtbar wird. \end{quote} \hyperdef{}{flowconf}{\subsection{Flußlinien gestalten}\label{flowconf}} @@ -2943,10 +2967,10 @@ wireder sichtbar wird. Bei manchen Stücken kommt es vor, dass die Flußlinie einer Stimme durch die Begleintnoten verläuft. In diemesm Fall muss man ggf. die Flußlinie um die Begleitnonten ``herumbiegen''. Da zu gibt es eine experimentelle -Möglichkeit die Flußlinine mit der Maus zu gestalten, ähnlich wie die +Möglichkeit die Flußlinie mit der Maus zu gestalten, ähnlich wie die Triolenbögen. -Die Bearbeitungsmöglickeiten müssen in der +Die Bearbeitungsmöglichkeiten müssen in der \hyperref[konsole-fenster]{Konsole} eingeschaltet werden. \begin{quote} @@ -2974,7 +2998,7 @@ für verschiedene Zielgruppen erstellen, z.B.: \item Einzelstimmen für Anfänger (z.B. nur die erste Stimme, Zählhilfen) \item - Beliebige Kombinatinen von Stimmen für Leiter und Fortgeschrittene + Beliebige Kombinationen von Stimmen für Leiter und Fortgeschrittene (z.B. zwei Stimmen, aber keine Zählhilfen mehr) \item verschiedene Hilfsinformationen (Zählhilfen, Taktnummern etc.) @@ -2984,7 +3008,7 @@ für verschiedene Zielgruppen erstellen, z.B.: Für jeden Auszug gibt es einen Satz von Konfigurationsparameetern (\texttt{extract.0}, \texttt{extract.1}) usw. welcher den Inhalt des -jeweiligen Auszuges bestimmt. Über die Schaltflcähe \texttt{Auzzug} +jeweiligen Auszuges bestimmt. Über die Schaltfläche \texttt{Auszug} kannst aktuell aktiven Auuszug einstellen. Der aktive Auszug bestimmt, \begin{itemize} @@ -2995,17 +3019,17 @@ kannst aktuell aktiven Auuszug einstellen. Der aktive Auszug bestimmt, auf welchen Auszug die Konfigurationsmasken wirken. \end{itemize} -Die Auszuüge werden durchnummeriert\footnote{Zupfnoter kann über die +Die Auszüge werden durchnummeriert\footnote{Zupfnoter kann über die Menüleiste die Auszüge 0-3 wählen. Braucht man mehr Auszüge, so ist das über die Konsole möglich.}. Der Auszug mit der \textbf{Nummer 0} hat eine besondere Rolle: Er gilt -als Vorgabe für die anderen Auszuüge. Die im Auszug 0 angegebenen Werte +als Vorgabe für die anderen Auszüge. Die im Auszug 0 angegebenen Werte für die Konfigurationsparameter wirken also auf die Auszüge mit höherer Nummer solange sie dort nicht überschrieben werden. Damit kannst du im Auszug 0 die grundlegenden Einstellungen vornehmen -und in den höherern Auszügen spezifische Anforderungen erfüllen. +und in den höheren Auszügen spezifische Anforderungen erfüllen. Einstellungen, die auch im Auszug 0 nicht definiert sind, belegt Zupfnoter mit programminternen Voreinstellungen. Diese Vorgabewerte sind @@ -3022,7 +3046,7 @@ so, dass folgende Auszüge definiert entstehen. \end{itemize} Dabei wird von einem vierstimmigen Satz ausgegangen und Flusslinien, -Synchronsiationslinen, Stimmenauswahl etc. darauf abgestimmt. +Synchronisationslinien, Stimmenauswahl etc. darauf abgestimmt. \needspace{15cm} @@ -3034,7 +3058,7 @@ In diesem Beispiel kannst du die Zusammenhänge sehen: \begin{itemize} \item - Auszug 0 ist hier so konifugriert + Auszug 0 ist hier so konfiguriert \begin{itemize} \itemsep1pt\parskip0pt\parsep0pt @@ -3078,7 +3102,7 @@ In diesem Beispiel kannst du die Zusammenhänge sehen: \begin{itemize} \itemsep1pt\parskip0pt\parsep0pt \item - Alle Strphen in einem Block (Angabe + Alle Strophen in einem Block (Angabe \texttt{"verses":\ {[}1,2,3,4{]}}) \item Liedtextblock 2 enthält keine Strophen mehr (Angabe @@ -3092,11 +3116,11 @@ In diesem Beispiel kannst du die Zusammenhänge sehen: \begin{quote} \textbf{Hinweis}: Die Angaben der auszugebenden Stimmen könnte an sich entfallen, da da sie der Voreinstellung in Zupfnoter entsprechen. Sie -sind hir nur zur Illustration sufgeführt. +sind hir nur zur Illustration aufgeführt. \end{quote} -\subsubsection{Praktisches Vorgehen bei der Erstellung von -Auszügen}\label{praktisches-vorgehen-bei-der-erstellung-von-auszuxfcgen} +\hyperdef{}{bestPracticeExtract}{\subsubsection{Praktisches Vorgehen bei +der Erstellung von Auszügen}\label{bestPracticeExtract}} Das Konzept der Auszüge in Zupfnoter ist ein mächtiges Werkzeug. Mächtige Werkzeuge müssen aber mit Bedacht eingesetzt werden, wenn man @@ -3127,7 +3151,7 @@ Daher ist folgendes Reihenfolge zu empfehlen: \textbf{Anlegen der Auszüge}: Ausgehend von der Planung sollte unter dem Menü \textbf{\texttt{Konfig.\ bearbeiten\ /\ Auszugsbeschriftung}} alle geplanten Auszüge angelegt werden. Dabei sollte ``Titel'', - ``Auzszugsnummer'', ``Filenamezusatz'' festegelegt werden. Der + ``Auszugsnummer'', ``Filenamezusatz'' festgelegt werden. Der eingegebenen Titel wird nun auch für das Menü zur Einstellung des Auszuges verwendet. @@ -3136,15 +3160,15 @@ Daher ist folgendes Reihenfolge zu empfehlen: \textbf{Bearbeitung der gemeinsamen Anteile}: Nun kannst du über das Menü \texttt{Konfig.\ bearbeiten\ /\ Grundeinstellungen} die Maske für die Grundeinstellungen aufrufen. Die hier gesetzten Einstellungen - wirke \textbf{auf alle nachfolgenden} Auszuüge. Daher ist es sinnvoll, + wirke \textbf{auf alle nachfolgenden} Auszüge. Daher ist es sinnvoll, z.b. Flusslinien, Synchronisationslinien, Wiederholungen usw. für alle - Stimmmen zu konfigurieren. Am besten konfiguriert man so weit, dass - das Blatt gut aussieht, d.h. Position der Legende und Liedtexte sollte + Stimmen zu konfigurieren. Am besten konfiguriert man so weit, dass das + Blatt gut aussieht, d.h. Position der Legende und Liedtexte sollte möglichst auf Auszug 0 erfolgen. - Auch die Sprunglinien sollten weitgehend in Auzszug 0 konfiguriert - werden. Nur in Ausnamefällen ist eine weitere Positionierung in - anderen Auszuügen notwendig. + Auch die Sprunglinien sollten weitgehend in Auszug 0 konfiguriert + werden. Nur in Ausnahmefällen ist eine weitere Positionierung in + anderen Auszügen notwendig. Als Faustregel gilt, so viel wie möglich auf Auszug 0 zu konfigurieren, so dass man im Grunde bei den Folgeauszügen nur noch @@ -3152,7 +3176,7 @@ Daher ist folgendes Reihenfolge zu empfehlen: \item \textbf{Bearbeitung der folgenden Auszüge}: Wenn Auszug 0 gut konfiguriert ist, dann kann man sich den anderen Auszügen zuwenden. - Dazu wird der zu bearbeitende Auszug im Menü rects oben eingestellt. + Dazu wird der zu bearbeitende Auszug im Menü rechts oben eingestellt. Die Konfigurationsmasken und Einstellungen mit der Maus wirken nun auf den eingestellten Auszug. @@ -3161,7 +3185,7 @@ Daher ist folgendes Reihenfolge zu empfehlen: richtigen Auszug eingestellt hat. Daher ist es wichtig den eingestellten Auszug immer wieder zu überprüfen. \includegraphics{../ZAUX_Images/040-042_Pruefen-Auszug-Grundeinstellungen.jpg}~ - Im vorliegenden Fall wird Auzug 0 konfiguriert. + Im vorliegenden Fall wird Auszug 0 konfiguriert. \end{quote} In den weiteren Auszügen kann man sich konzentrieren auf: @@ -3186,7 +3210,7 @@ Daher ist folgendes Reihenfolge zu empfehlen: Die flexible Konfiguration von Zupfnoter erlaubt die Anpassung der Auasgabe auf viele verschiedene Instrumente. Allerdings führt hier meist eine Kombination verschiedener Parameter zu Ziel. Zur Vereinfachung sind -diese Konmbinationen für gebräücliche Instrumente hinterlegt. +diese Kombinationen für gebräuchliche Instrumente hinterlegt. Wähle das Menü \textbf{``\texttt{Konfig.\ bearbeiten\ \textgreater{}\ Instrument\ spez.}''}. @@ -3201,7 +3225,7 @@ gewünschte Instrument auswählen. \begin{quote} \textbf{Hinweis}: Bitte beachte, dass es auch einen Parameter ``Instrument'' gibt. Dieser ist nicht zu verwechseln mit der -Schnelleinstellung, auch wenn er zum Teil dieselben Bezeichungen +Schnelleinstellung, auch wenn er zum Teil dieselben Bezeichnungen verwendet. Der Parameter \texttt{Instrument} veränderte Programminterne Abläufe welche sich nicht über Konfiguration ausdrücken lässt (z.b. diatonische Stimmung bei Saitenspiel) @@ -3232,12 +3256,12 @@ funktioniert. Wenn das Musikstück nicht auf die Harfe passt, kann man es ggf. durch transponieren zurecht schieben. Dazu gibt man in der ABC-Notation z.B. -die folgende Kopfzeile ein. Diese veschiebt das Stück drei Halbtnach -unten (in den Unterlegnoten also nach links). +die folgende Kopfzeile ein. Diese verschiebt das Stück drei Halbtöne +nach unten (in den Unterlegnoten also nach links). \begin{quote} \textbf{Hinweis}: Zupfnoter gibt die Transponierung der ersten Stimme im -Unterlegnotenblatt aus. Abweichende Transpnierungen in den anderen +Unterlegnotenblatt aus. Abweichende Transponierungen in den anderen Stimmen werden zwar ausgeführt, aber nicht vermerkt. \end{quote} @@ -3288,7 +3312,7 @@ K:C shift=CG CDE \end{verbatim} -is äquivalient zu +is äquivalent zu \begin{verbatim} K:G @@ -3309,7 +3333,7 @@ Dies erreicht man mit \texttt{\%\%score\ 1\ 2\ 3\ 4} -Das bewirkt ein Notensystem mit einer Noteznzeile pro Stimme. Weitere +Das bewirkt ein Notensystem mit einer Notenzeile pro Stimme. Weitere Einzelheiten im nächsten Kapitel. In diesem Zusammenhang ist es auch hilfreich, die Taktnummern @@ -3328,7 +3352,7 @@ korrekt. \end{quote} \subsubsection{Mehrere Stimmen in -ABC-Notation}\label{mherere-Stimmen-in-abc} +ABC-Notation}\label{mehrere-Stimmen-in-abc} Da das im Zupfnoter-tutorial dieses Thema eher knapp behandelt ist gibt es hier weitere Informationen. @@ -3350,10 +3374,10 @@ Darin ist \begin{itemize} \item - \texttt{\textless{}ID\textgreater{}} eine Identifiaktion der Stimme, + \texttt{\textless{}ID\textgreater{}} eine Identifikation der Stimme, sie wird inder \texttt{\%\%score} - Anweisung referenziert. Es - empfhiehlt sich hier einfach ganze Zahlen zu verwenden un ddie Stimme - so durchzunumerieren. + empfiehlt sich hier einfach ganze Zahlen zu verwenden un die Stimme so + durchzunumerieren. \item \texttt{{[}clef={]}\textless{}clef\ name\textgreater{}} optionale Angabe des Notenschlüssels. Name ist @@ -3400,7 +3424,7 @@ Zusammenhang von Zupfnoter relevante Beispiele \textbf{Hinweis}: In einigen Konfigurationseinstellungen von Zupfnoter werden Stimmen über eine Stimmen-Nummer angegeben. Die dabei relevante Nummerierung der Stimmem ergibt sich aus der Reihenfolge der Stimmen in -der \texttt{\%\%score} - Anweisung im ABC-Notation (nicht zu verwecheln +der \texttt{\%\%score} - Anweisung im ABC-Notation (nicht zu verwechseln mit der Identifikation der Stimme in der \texttt{V:} - Zeile. \end{quote} @@ -3428,8 +3452,8 @@ sollten in folgender Reihenfolge ausgeführt werden. unmotivierten Vorschübe. \item Synchronisationslinien abschalten (das Feld im Edior löschen oder - `0-1' eintragen). Bei shr vollen Blättern verwirren die - Synchronisationslinene mehr als sie helfen. + `0-1' eintragen). Bei sehr vollen Blättern verwirren die + Synchronisationslinien mehr als sie helfen. \item im Konfigurationsmenü \texttt{Layout} mit den Schnelleinstellungen \texttt{layout}~\texttt{kompakt} bzw. \texttt{Packer}~\texttt{kompakt} @@ -3490,8 +3514,8 @@ Häufige Einstellungen bei Zupfnoter sind: \texttt{I:staffnonote\ 2} - zeigt auch leere Notenlinien in der Notenvorschau \item - \texttt{I:linewarn\ 0} - unterdrückt Meldungenüber nicht gefüllte oder - zu volle Zeilen in der Notenvorschau + \texttt{I:linewarn\ 0} - unterdrückt Meldungen über nicht gefüllte + oder zu volle Zeilen in der Notenvorschau \end{itemize} Zupfnoter verwendet von sich aus die folgenden Einstellungen: @@ -3504,6 +3528,79 @@ I:linewarn 0 I:staffnonote 2 \end{verbatim} +\hyperdef{}{filetemplates}{\subsubsection{Arbeiten mit +Dateivorlagen}\label{filetemplates}} + +Erstellt man über das Menü ``Neu'' ein neues Stück, fügt Zupfnoter eine +Vorlage ein. Standardmäßig ist das die Vorlage für ein vierstimmiges +Stück. Dieses legt auch die Konfiguration an welche in Kapitel +\hyperref[bestPracticeExtract]{Praktisches Vorgehen bei der Erstellung +von Auszügen} beschrieben ist. + +Wenn man z.B. für eine Notenmappe mehrere Stücke mit ähnlichen +Einstellungen schreiben will, ist es sinnvoll, die eingebaute Vorlage +durch eine projektspezifische Vorlage zu ersetzen, in der schon eineige +Parameter (z.B. Blattbeschriftungen) vorausgefüllt sind. + +Zupfnoter bietet eine experimentelle Unterstützung über die +\hyperref[konsole-fenster]{Konsole}. In folgenden Schritten kann ein +eigene Vorlage eingerichtet werden: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \texttt{edittemplate}: Damit wird das aktuelle Template in den Editor + geladen und kann angepasst werden. +\item + \texttt{editconf\ template}: Damit werde die Template-spezifischen + Eigenschaften (Dateiname und Titel) eingstellt. + + \begin{quote} + \textbf{Hinweis}: Man muss von Hand auf den Reiter ``Konfiguration'' + schalten um die Konfigurationsmaske zu sehen. + + \textbf{Hinweis}: mit diesem Befehl kann man auch feststellen, welche + Vorlage gerade aktiv ist. + \end{quote} +\item + \texttt{settemplate}: Damit wird der aktuelle Editor-Inhalt als + Template hinterlegt +\item + Menüpunkt `Speichern': Damit wird der Editorinhalt gespeichert. + + \begin{quote} + \textbf{Hinweis}: Dabei ist es wichtig, dass die Kopfzeile \texttt{F:} + einen Platzhalter - Zeichen \texttt{\{\{} enthält. Dadurch wird im + ``Template\_modus'' gespeichert, d.h. der Dateiname wird nicht aus der + \texttt{F:} - Zeile entnommen sondern aus \texttt{template.filebase} + \end{quote} + + \begin{quote} + \textbf{Hinweis} Beim Bearbeiten des Templates kommt immer wieder die + Meldung wie + + \texttt{"\{\{song\_id\}\}\_\{\{filename\}\}":\ Fehlerhafte\ Zeichen\ im\ Filenamen} + + Das kommt daher dass die Platzhalter in der Dateivorlage ja nicht + aufgelöst sind, daher wird die F: - Kopfzeile als fehlerhaft markiert. + \end{quote} +\end{enumerate} + +Eine Dateivorlage ist eine normale ABC-Datei in der einige Platzhalter +eingefügt sind, welche beim erstellen eines neuen Stückes anhand der +Benutzereingaben aufgelöst bzw. ausgefüllt werden. Folgende Platzhalter +sind verfügbar: + +\begin{description} +\itemsep1pt\parskip0pt\parsep0pt +\item[\texttt{\{\{song\_id\}\}}] +Das ist die Identifikationsnummer des Stückes +\item[\texttt{\{\{filename\}\}}] +Das ist die Basis für den Dateinamen +\item[\texttt{\{\{song\_title\}\}}] +Das ist der Titel des Stückes. +\end{description} + \subsubsection{Parameter in der Zupfnoter-URL}\label{parameter-in-der-zupfnoter-url} @@ -3593,7 +3690,7 @@ TODO:\marginpar{TODO} text überarbeiten Begleitnoten) {[}extract.x.synchlines{]} Diese Einstellung bestimmt, zwischen welchen Stimmen die - Synchronisiationslinien dargestellt werden. + Synchronisationslinien dargestellt werden. \textbf{Hinweise:} Synchronisationslinien für Mehrklänge werden immer dargestellt. @@ -3604,8 +3701,8 @@ TODO:\marginpar{TODO} text überarbeiten Überschrift des Musikstückes und der Informationsblock separat positioniert werden. - \textbf{Hinweis:} durch Veschieben der Objekte mit der Maus wird diese - Einstellung automatisch eingefügt. + \textbf{Hinweis:} durch Verschieben der Objekte mit der Maus wird + diese Einstellung automatisch eingefügt. \item \textbf{Liedtexte:} (Liedtexte) {[}extract.x.lyrics{]} @@ -3675,7 +3772,7 @@ Taktstrich auf den sie sich beziehen. Zupfnoter-Annotations beginnen mit einem der Zeichen \texttt{:}, \texttt{@}, \texttt{!}, \texttt{\#}, \texttt{\textless{}}, -\texttt{\textgreater{}}. Beispielwesie bedeutets +\texttt{\textgreater{}}. Beispielsweise bedeutet \texttt{"\^{}\textgreater{}"} dass das Notensymbol in den Unterlegnoten nach rechts verschoben werden. @@ -3691,8 +3788,8 @@ Es gibt folgende Zusätze: \begin{itemize} \item \textbf{\texttt{\^{}:}} - Sprungziel: Damit kannst du ein Ziel - festelegen zu dem eine Sprunglinie gezeichnet werden kann. Damit - kannst du beliebige Sprünge darstellen. + festlegen zu dem eine Sprunglinie gezeichnet werden kann. Damit kannst + du beliebige Sprünge darstellen. \item \textbf{\texttt{\^{}@}} - Sprung: Damit kannst du eine Sprunglinie erzeugen. Beispiele: \texttt{@p1@3}, \texttt{@@-4} @@ -5864,6 +5961,36 @@ Hier kannst du die Pausenposition vor einer Wiederholung einstellen. \end{verbatim} +\subsection{\texorpdfstring{\texttt{template} - +Dateivorlate}{template - Dateivorlate}}\label{template} + +TODO:\marginpar{TODO} Helptext für template einfügen + +\begin{verbatim} + "template": {"filebase": null, "title": "- no template -"} + +\end{verbatim} + +\subsection{\texorpdfstring{\texttt{template.filebase} - +Dateibasis}{template.filebase - Dateibasis}}\label{template.filebase} + +TODO:\marginpar{TODO} Helptext für template.filebase einfügen + +\begin{verbatim} + "filebase": null + +\end{verbatim} + +\subsection{\texorpdfstring{\texttt{template.title} - +Titel}{template.title - Titel}}\label{template.title} + +TODO:\marginpar{TODO} Helptext für template.title einfügen + +\begin{verbatim} + "title": "- no template -" + +\end{verbatim} + \subsection{\texorpdfstring{\texttt{templates} - Vorlagen}{templates - Vorlagen}}\label{templates} @@ -6270,7 +6397,7 @@ Vorversion}\label{inkompatibile-uxe4nderungen-zur-vorversion} \item Schneidemarken werden nur auch bei A4-Ausddruck ausgegeben \item - Beschrifungen für Variante Enden werden unterddrückt, wenn keine + Beschriftungen für Variante Enden werden unterddrückt, wenn keine Sprunglinien ausgegeben werden \item Taktnummern und Zählhinweise werden für unterdrückte Pause nicht mehr @@ -6427,7 +6554,7 @@ issues}\label{backward-compatibility-issues} \begin{itemize} \itemsep1pt\parskip0pt\parsep0pt \item - now we have configuration paramters for printer optimimization \#82 + now we have configuration parameters for printer optimimization \#82 \item now have forms based configuration \#67 \item diff --git a/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_review.pdf b/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_review.pdf index fa852b8b..69da7acc 100644 Binary files a/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_review.pdf and b/30_sources/ZGEN_Documents/UD_Zupfnoter-Handbuch-de_review.pdf differ