]> Shamusworld >> Repos - ardour-manual/commitdiff
New build system for documentation.
authorShamus Hammons <jlhamm@acm.org>
Sat, 4 Feb 2017 15:00:50 +0000 (09:00 -0600)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 13 Feb 2017 21:02:43 +0000 (22:02 +0100)
The new build system is documented in README.md, take a look to see the
nitty gritty. Major changes are: structure of the document is no longer
controlled by the filesystem, internal links are now 'unbreakable'.

67 files changed:
README.md
STYLE_GUIDE
_config.yml [deleted file]
_layouts/bootstrap.html [deleted file]
_layouts/default.html [deleted file]
build.py [new file with mode: 0755]
build.rb [deleted file]
explode.py [new file with mode: 0755]
implode.py [new file with mode: 0755]
import.rb [deleted file]
include/ardour-concepts.html [new file with mode: 0644]
include/ardour-setup-for-surround.html [new file with mode: 0644]
include/ardour-systems.html [new file with mode: 0644]
include/arranging-regions.html [new file with mode: 0644]
include/audio-recording.html [new file with mode: 0644]
include/automation.html [new file with mode: 0644]
include/basic-mixing.html [new file with mode: 0644]
include/clocks.html [new file with mode: 0644]
include/configuring-midi.html [new file with mode: 0644]
include/controls.html [new file with mode: 0644]
include/edit-mode-and-tools.html [new file with mode: 0644]
include/editing-basics.html [new file with mode: 0644]
include/editing-regions-and-selections.html [new file with mode: 0644]
include/fades-and-crossfades.html [new file with mode: 0644]
include/favorite-plugins-window.html [new file with mode: 0644]
include/file-and-session-management-and-compatibility.html [new file with mode: 0644]
include/grouping-tracks.html [new file with mode: 0644]
include/i_o-setup.html [new file with mode: 0644]
include/importing-and-exporting-session-data.html [new file with mode: 0644]
include/kde-plasma-5.html [new file with mode: 0644]
include/keyboard-and-mouse-shortcuts.html [new file with mode: 0644]
include/lua-scripting-in-ardour.html [new file with mode: 0644]
include/making-selections.html [new file with mode: 0644]
include/memory-locations.html [new file with mode: 0644]
include/midi-editing.html [new file with mode: 0644]
include/midi-editors.html [new file with mode: 0644]
include/midi-event-list.html [new file with mode: 0644]
include/midi-recording.html [new file with mode: 0644]
include/mixdown.html [new file with mode: 0644]
include/mixer-strips.html [new file with mode: 0644]
include/multichannel-tracks-and-signal-routing.html [new file with mode: 0644]
include/playing-back-track-material.html [new file with mode: 0644]
include/playlists.html [new file with mode: 0644]
include/plugin-and-hardware-inserts.html [new file with mode: 0644]
include/plugins-bundled-with-ardour.html [new file with mode: 0644]
include/preferences.html [new file with mode: 0644]
include/punch-recording-modes.html [new file with mode: 0644]
include/record-setup.html [new file with mode: 0644]
include/region-loops-and-groups.html [new file with mode: 0644]
include/rhythm-ferret.html [new file with mode: 0644]
include/score-editor.html [new file with mode: 0644]
include/sessions.html [new file with mode: 0644]
include/surround-panning-and-mixing.html [new file with mode: 0644]
include/system-setup.html [new file with mode: 0644]
include/techniques-for-working-with-tempo-and-meter.html [new file with mode: 0644]
include/time_-tempo-and-meter.html [new file with mode: 0644]
include/tracks.html [new file with mode: 0644]
include/using-key-bindings.html [new file with mode: 0644]
include/welcome-to-ardour.html [new file with mode: 0644]
include/working-with-field-recorders-in-ardour.html [new file with mode: 0644]
include/working-with-synchronization.html [new file with mode: 0644]
include/working-with-video-in-ardour.html [new file with mode: 0644]
master-doc.txt [new file with mode: 0644]
page-template.txt [new file with mode: 0644]
source/images/favorite-plugins.png [new file with mode: 0644]
source/images/mixer-to-fav-dnd.png [new file with mode: 0644]
source/index.html

index dadce20797258e5265483636324640963430f53f..4645752e1be99a1261a89473a1f0ff3758eece7d 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,10 +1,7 @@
 
 # The Ardour Manual
 
-
-This is the project that generates the static ardour manual website available at [manual.ardour.org](http://manual.ardour.org).
-
-The site is built using ruby (I use 1.9[.3]) and [liquid](http://liquidmarkup.org/), a ruby gem.
+This is the project that generates the static ardour manual website available at [manual.ardour.org](http://manual.ardour.org). The site is built using python 3.
 
 ### Get the code
 
@@ -15,80 +12,45 @@ The site is built using ruby (I use 1.9[.3]) and [liquid](http://liquidmarkup.or
 
 There are 2 different types of content:
 
-- special `_manual` content
-- normal content
-
-### Special `_manual` content
-
-This is content that ends up as part of the tree on the left.
+- a master document which describes the overall structure of the manual
+- normal content, which is described in the master document
 
-The _raw_ content is in `_manual/` directory and has a naming convention as follows:
+### The Master Document
 
-    # content for a page at http://manual.ardour.org/<slug>/
+This is a text file (master-doc.txt) which describes the structure of the manual. It does this
+through headers which tell the build script where the content lives, what its
+relationship to the overall structure is, as well as a few other things.
 
-    <ordering>_<slug>.<html|md|textile>
-       ^          ^     ^
-       |          |     |
-       |          |   extension is removed later
-       |          |
-       |     ends up as part of URL
-       |
-     only used for ordering
+All headers have a similar structure, and have to have at least the following
+minimal structure:
 
+    ---
+    title: Some Wordy and Expressive Title
+    part: part
+    ---
 
-    # a folder for subcontent is like this
-
-    <ordering>_<slug>/
-
-    # more things can then go in here for http://manual.ardour.org/<slug>/<slug2>/
-
-    <ordering>_<slug>/<ordering2>_<slug2>.html
+Keywords that go into the header are of the form:
 
-So, for example:
+       keyword: value
 
+Here are the keywords you can put in, and a brief description of what they do:
 
-| this file                        | appears at url      |
-|--------------------------------------------------------|
-| _manual/01_main.html             | /main/              |
-| _manual/01_main/01_subpage.html  | /main/subpage/      |
 
+| Keyword | Meaning  |
+| ------- | -------- |
+| title   | Sets the title for the content that follows |
+| menu_title | Sets the title for the content that follows which will appear in the menu link sidebar. If this is not specified, it defaults to the value of the `title` keyword |
+| part    | Sets the hierarchy for the content that follows. It must be one of the following (listed in order of lowering hierarchy): part, chapter, subchapter, section, subsection.  |
+| link    | Sets the unbreakable link to the content that follows. Links in the *content* should be prefixed with a double at-sign (@@) to tell the build system that the link is an internal one |
+| include | Tells the build system that the content lives in an external file; these normally live in the `include/` directory. Note that the filename should **not** be prefixed with `include/` |
+| exclude | Tells the `implode` and `explode` scripts that file referred to by the `include` keyword should be ignored. Note that the value of this keyword is ignored |
+| style   | Sets an alternate CSS stylesheet; the name should match the one referred to (sans the `.css` suffix) in the `source/css` directory |
 
 ### Normal content
 
-This is anything else, css files, images, fixed pages, layouts. This content lives in the `source` directory.
-
-If you added `source/images/horse.png` is would be available at the url `/images/horse.png` after publishing it.
-
-Content processing is applied to normal content if it has the correct header as described below.
-
-
-## Content processing
-
-Three types of content can have special processing done.
-
-- `.html` liquid/HTML files
-- `.md` markdown files
-- `.textile` textile files
-
-All files to be processed should also have a special header at the top too:
-
-    ---
-    layout: default
-    title: Some Very Wordy and Expressive Title
-    menu_title: Some Title
-    ---
-
-    <p>My Actual Content</p>
-
-The `title` field will end up as an `h1` in the right panel. The `menu_title` is what is used in the menu tree on the left (if not preset it will default to using `title`).
-
-### `.html` files
-
-These are almost normal html, but extended with [Liquid templates](http://liquidmarkup.org/). There are a couple of special tags created for this project.
-
-- `{% tree %}` is what shows the manual structure in the left column
-- `{% children %}` shows the immediate list of children for a page
+Manual content goes into the `include/` directory (or in the Master Document itself); and consists of normal HTML, sans the usual headers that is normally seen in regular HTML web pages. Any other content, such as css files, images, files and fixed pages goes into the `source/` directory.
 
+Adding `source/images/horse.png` makes it available at the url `/images/horse.png` after publishing it; things work similarly for `source/files/` and `source/css/`.
 
 ## More Advanced Stuff
 
@@ -98,21 +60,20 @@ notes just in case you decide to anyway.
 ### Run it locally
 
 You may want the manual available on a machine that doesn't have constant
-internet access. You will need `git`, `ruby`, and the ruby gem `liquid` installed.
+internet access. You will need `git`, and `python` installed.
 
 1. Download code and build manual
 
   ```
   git clone <repo-url> ardour-manual
   cd ardour-manual
-  cp -r source _site
-  ruby ./build.rb
-  chmod -R a+rx _site
+  ./build.py
   ```
 
-2. open `ardour-manual/_site/index.html` in your favorite web browser
+2. open `ardour-manual/website/index.html` in your favorite web browser
 
   If this page doesn't open and function correctly, follow these optional steps to serve up the page with nginx.
+  N.B.: Step 2 will *never* work; you *must* install nginx if you want to see it!
 
 3. Install [nginx](http://wiki.nginx.org/Install)
 4. Configure nginx server block in `/etc/nginx/sites-available/default`
@@ -122,7 +83,7 @@ internet access. You will need `git`, `ruby`, and the ruby gem `liquid` installe
       listen 80;
       server_name localhost;
 
-      root ...path_to_.../ardour-manual/_site;
+      root ...path_to_.../ardour-manual/website;
       index index.html;
   }
   ```
@@ -133,20 +94,8 @@ internet access. You will need `git`, `ruby`, and the ruby gem `liquid` installe
 
 6. The manual will now be available at http://localhost
 
-### manual.rb plugin
-
-Much of the functionality comes from `_plugins/manual.rb` - it takes the _manual format_ (contained in `_manual/`) and mushes it around a bit into a tmp directory.
-
-This is to enable the directory tree to be understood, child page lists to be constructed, clean URLs, and the correct ordering of pages maintained.
-
-### Clean URLs
-
-To allow the clean URLs (no `.html` extension) _and_ to support simple hosting (no `.htaccess` or apache configuration required) each page ends up in it's own directory with an `index.html` page for the content.
-
-E.g. `02_main/05_more/02_blah.html` after all processing is complete would end up in `_site/main/more/blah/index.html`.
-
-The page format contained in the `_manual/` directory is different to the final rendered output (see special `_manual` content above) to make it simple to create content (you don't need to think about the `index.html` files).
-
+### Helper scripts: `implode` and `explode`
 
+The `implode` and `explode` scripts exist in order to accomodate different working styles. `implode` takes all the files referenced by the `include` keywords in the headers in the Master Document and automagically puts them into the Master Document in their proper places. Note that any header that has an `exclude` keyword will remain in the `include/` directory. `explode` does the inverse of `implode`; it takes all the content in the Master Document and blows it into individual files in the `include/` directory. Filenames are automagically derived from the value of the `title` keyword.
 
 
index be65d6381b365ee4a7596826b116489ec9315d1d..09f7a6c51e43b352f12557d6283bb76f7b038a01 100644 (file)
@@ -114,9 +114,9 @@ is renamed or moved to another sub-directory, links should be ok.
 <dfn>
 encloses a newly introduced term that is being explained. Use for the first
 occurrence of the main concept of every manual page, or the first occurrence
-of a new concept after a sub-heading if necessary. Renders in bold face.
-Keep in mind that <dfn> tags might be used to generate an index of keywords
-- don't pollute it too much.
+of a new concept after a sub-heading if necessary. Renders in bold face. Keep
+in mind that <dfn> tags might be used to generate an index of keywords--don't
+pollute it too much.
 
 <abbr>
 is used to explain an abbreviation such as <abbr title="Linux Audio
@@ -124,7 +124,7 @@ Developers Simple Plugin API">LADSPA</abbr>. Browsers will usually pop up the
 definition when the user hovers over the word. Renders as dotted underlined
 in most browsers.
 On each page, use only for the first occurrence of every abbreviation. Avoid
-a redundant explanation in the text - the expansion can easily be extracted 
+a redundant explanation in the text--the expansion can easily be extracted 
 via CSS for printing.
 Use only in the text body, not in headings.
 
@@ -138,6 +138,7 @@ is used to strongly emphasize a word. Commonly rendered in bold.
 See above for usage.
 
 <br />
+Most of the time, these should be avoided, and used very infrequently.
 A line-break can sometimes be used to structure a paragraph, or to split a
 longish heading. Never use spurious <br/>s at the end of paragraphs or to
 control the spacing of sections. If you're unhappy with those, fix the CSS
@@ -191,6 +192,9 @@ So if you want the user to press Ctrl-N on Linux, that's actually <kbd
 class="mod1">N</kbd>. It will render as "Ctrl N" for you, and as "Cmd N" for
 your Mac-using friend. Nice, uh?
 
+N.B.: If you want to have just the name of the modifier key by itself, use
+<kbd class="mod1>&zwnj;</kbd> (zero-width non-joiner).
+
 For anything you want the user to type, use <kbd> as a block-level element.
 See above for other <kbd> classes to denote menu items, selections, mouse
 events and controller actions.
@@ -227,7 +231,8 @@ descriptive 'alt="A short textual description of the image content"'
 element.
 Images are usually placed as block-level elements, i.e. outside of a
 paragraph, unless they are no higher than one row and make sense in the text
-flow.
+flow. Aside from this exception, they should *always* be wrapped inside of a
+<p></p> block.
 
 5. Other conventions
 ====================
@@ -240,21 +245,27 @@ flow.
   kind of subtle inflection, use semantic markup instead.
 * The hyphen is used to for compound words such as this well-advised example.
 * Do not hyphenate words at line breaks.
-* For breaks in thought &mdash; such as this splendid example &mdash; use
-  the long em-dash.
-* For ranges of values, use the en-dash: Monday &ndash; Friday, 0 &ndash;
-  11.
+* For breaks in thought&mdash;such as this splendid example&mdash;use
+  the long em-dash. Note that the em-dash is snugged up against the text on both
+  sides--this is the proper way to use them.
+* For ranges of values, use the en-dash: Monday&ndash;Friday, 0&ndash;11. Note
+  again, the en-dash is snugged up to its surrounding elements.
 * Use a non-breaking space ("&nbsp;") between a number and its unit.
+* Colons (":") always snug up to their text on the left: it is an error to add
+  space between text on the left and the colon.
 
 
 5.2 Language
 ------------
 
-* The Ardour manual is written in Americal English spelling.
+* The Ardour manual is written in American English spelling.
 * Use SI units with standard abbreviations. Give imperial units only as
   additional information, if at all.
-* Do not use contractions like "you'll", always write full forms.
-* Do not over-use "You", write about the program, not the user.
+* Do not use contractions like "it'll", always write full forms.
+* Do not over-use "You", write about the program, not the user. Avoid it if at 
+  all possible, it makes for tighter and better reading text.
+* Always write out numbers less than 11. E.g., "One or two ..." instead of
+  "1 or 2 ...".
 
 
 5.3 Chapter Headline Capitalization
@@ -297,6 +308,8 @@ content per heading and you do not expect the article to grow.
 * If pages grow long, consider splitting them into sub-chapters at their
 headings.
 * Nobody needs "the next paragraph is about the following" paragraphs.
+* When creating a <p class="note">NOTE</p>, *do not* put the word NOTE into
+  the note, the styling tells the user that it is a note.
 
 5.6. Encoding
 -------------
@@ -306,3 +319,4 @@ headings.
 HTML character entities instead, for example for cursor arrows: &rarr;
 &larr; &uarr; &darr;. Diacriticals on vowels and other special letters are
 probably ok by now, so don't bother with &eacute; and friends, just type Ã©.
+
diff --git a/_config.yml b/_config.yml
deleted file mode 100644 (file)
index 0ffca95..0000000
+++ /dev/null
@@ -1 +0,0 @@
-source: source
diff --git a/_layouts/bootstrap.html b/_layouts/bootstrap.html
deleted file mode 100644 (file)
index f949bbb..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
----
-bootstrap_path: /bootstrap-2.2.2
-page_title: The Ardour Manual
----
-
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-      
-    <head>
-        <title>{{page.page_title}}</title>
-        <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
-
-        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-        <link href="{{page.bootstrap_path}}/css/bootstrap.min.css" rel="stylesheet" />
-        <link href="{{page.bootstrap_path}}/css/bootstrap-responsive.min.css" rel="stylesheet" />
-
-        <link href="/css/app.css" rel="stylesheet" />
-        {% if page.style %}
-        <link href="/css/{{page.style}}.css" rel="stylesheet" />
-        {% endif %}
-
-        <link href='http://fonts.googleapis.com/css?family=Junge' rel='stylesheet' type='text/css' />
-    </head>
-    <body>
-
-        <!--
-    <div class="navbar">
-        <div class="navbar-inner">
-            <div class="container">
-              <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-              </a>
-                <a class="brand" href="#">The Ardour Manual</a>
-                <div class="nav-collapse collapse">
-                </div>
-            </div>
-        </div>
-    </div>
-    -->
-
-    <div class="container-fluid">
-        <div class="row-fluid">
-            <div id="tree">
-                <div id="tree-inner">
-                    <h1 class="title"><a href="/"><img src="/images/logo.png" alt="The Ardour Manual" /></a></h1>
-                    {% tree %}
-                </div>
-            </div>
-            <div class="span12" id="content">
-                <div id="search" class="gcse-search">
-                </div>
-                <div id="content-main">
-                    <h1 class="title">{{ page.title }}</h1>
-                    {{ content }}
-                   {% prevnext %}
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <script type="text/javascript">
-    //<![CDATA[
-
-        // I'll go to hell for this
-        var isA = function(regex) { return navigator.userAgent.match(regex) };
-        var isAbout = function(regex) { return document.getElementsByTagName('h1')[1].textContent.match(regex) };
-
-        if ( (isA(/Mac/) || isAbout(/OS X/)) && (!isAbout(/Linux/)) ) {
-            var e = document.getElementsByTagName('body')[0];
-            e.className += ' mac';  // class magic for Cmd vs. Ctrl keys.
-        }
-    //]]>
-    </script>
-
-    <script type="text/javascript">
-        (function() {
-          var cx = '011950134405426689607:2lg2y9xgf3a';
-          var gcse = document.createElement('script'); gcse.type = 'text/javascript';
-          gcse.async = true;
-          gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
-              '//www.google.com/cse/cse.js?cx=' + cx;
-          var s = document.getElementsByTagName('script')[0];
-          s.parentNode.insertBefore(gcse, s);
-        })();
-    </script>
-  
-    </body>
-</html>
diff --git a/_layouts/default.html b/_layouts/default.html
deleted file mode 100644 (file)
index 8a79e18..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
----
-layout: bootstrap
----
-
-{{content}}
\ No newline at end of file
diff --git a/build.py b/build.py
new file mode 100755 (executable)
index 0000000..8ac84d4
--- /dev/null
+++ b/build.py
@@ -0,0 +1,495 @@
+#!/usr/bin/python3
+#
+# Script to take the master document and ancillary files and create the
+# finished manual/website.
+#
+# by James Hammons
+# (C) 2017 Underground Software
+#
+
+# Remnants (could go into the master document as the first header)
+
+#bootstrap_path: /bootstrap-2.2.2
+#page_title: The Ardour Manual
+
+import os
+import re
+import shutil
+import argparse
+
+
+#
+# Create an all lowercase filename without special characters and with spaces
+# replaced with dashes.
+#
+def MakeFilename(s):
+       # Cleans up the file name, removing all non ASCII or .-_ chars
+       fn = re.sub(r'[^.\-_a-zA-Z0-9 ]', '', s)
+       fn = fn.lower()
+       fn = fn.replace(' ', '-')
+       return fn
+
+
+#
+# Parse headers into a dictionary
+#
+def ParseHeader(fileObj):
+       header = {}
+
+       while (True):
+               hdrLine = fileObj.readline().rstrip('\r\n')
+
+               # Break out of the loop if we hit the end of header marker
+               if hdrLine.startswith('---'):
+                       break
+
+               # Check to see that we have a well-formed header construct
+               match = re.findall(': ', hdrLine)
+
+               if match:
+                       # Parse out foo: bar pairs & put into header dictionary
+                       a = re.split(': ', hdrLine, 1)
+                       header[a[0]] = a[1]
+
+       return header
+
+
+#
+# Turn a "part" name into an int
+#
+def PartToLevel(s):
+       level = -1
+
+       if s == 'part':
+               level = 0
+       elif s == 'chapter':
+               level = 1
+       elif s == 'subchapter':
+               level = 2
+       elif s == 'section':
+               level = 3
+       elif s == 'subsection':
+               level = 4
+
+       return level
+
+#
+# Converts a integer to a roman number
+#
+def num2roman(num):
+       num_map = [(1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'), (100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'), (10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')]
+       roman = ''
+
+       while num > 0:
+               for i, r in num_map:
+                       while num >= i:
+                               roman += r
+                               num -= i
+
+       return roman
+
+#
+# Capture the master document's structure (and content, if any) in a list
+#
+def GetFileStructure():
+       fs = []
+       fnames = [None]*6
+       content = ''
+       grab = False
+       mf = open('master-doc.txt')
+
+       for ln in mf:
+               if ln.startswith('---'):
+                       # First, stuff any content that we may have read into the current
+                       # header's dictionary
+                       if grab:
+                               fs[-1]['content'] = content
+                               grab = False
+                               content = ''
+
+                       # Then, get the new header and do things to it
+                       hdr = ParseHeader(mf)
+                       level = PartToLevel(hdr['part'])
+                       hdr['level'] = level
+                       fnames[level] = MakeFilename(hdr['title'])
+                       fullName = ''
+
+                       for i in range(level + 1):
+                               fullName = fullName + fnames[i] + '/'
+
+                       hdr['filename'] = fullName.rstrip('/')
+                       fs.append(hdr)
+
+                       if ('include' not in hdr) and (level > 0):
+                               grab = True
+               else:
+                       if grab:
+                               content = content + ln
+
+       # Catch the last file, since it would be missed above
+       if grab:
+               fs[-1]['content'] = content
+
+       mf.close()
+       return fs
+
+
+#
+# Determine if a particular node has child nodes
+#
+def HaveChildren(fs, pos):
+       # If we're at the end of the list, there can be no children
+       if pos == len(fs) - 1:
+               return False
+
+       # If the next node is at a lower level than the current node, we have
+       # children.
+       if fs[pos]['level'] < fs[pos + 1]['level']:
+               return True
+
+       # Otherwise, no children at this node.
+       return False
+
+
+#
+# Get the children at this level, and return them in a list
+#
+def GetChildren(fs, pos):
+       children = []
+       pos = pos + 1
+       childLevel =  fs[pos]['level']
+
+       while fs[pos]['level'] >= childLevel:
+               if fs[pos]['level'] == childLevel:
+                       children.append(pos)
+
+               pos = pos + 1
+
+               # Sanity check
+               if pos == len(fs):
+                       break
+
+       return children
+
+
+#
+# Make an array of children attached to each node in the file structure
+# (It's a quasi-tree structure, and can be traversed as such.)
+#
+def FindChildren(fs):
+       childArray = []
+
+       for i in range(len(fs)):
+               if HaveChildren(fs, i):
+                       childArray.append(GetChildren(fs, i))
+               else:
+                       childArray.append([])
+
+       return childArray
+
+
+#
+# Make an array of the top level nodes in the file structure
+#
+def FindTopLevelNodes(fs):
+       level0 = []
+
+       for i in range(len(fs)):
+               if fs[i]['level'] == 0:
+                       level0.append(i)
+
+       return level0
+
+
+#
+# Find all header links and create a dictionary out of them
+#
+def FindInternalLinks(fs):
+       linkDict = {}
+
+       for hdr in fs:
+               if 'link' in hdr:
+                       linkDict['@@' + hdr['link']] = '/' + hdr['filename'] + '/'
+
+       return linkDict
+
+
+#
+# Internal links are of the form '@@link-name', which are references to the
+# 'link:' field in the part header. We have to find all occurances and replace
+# them with the appropriate link.
+#
+def FixInternalLinks(links, content, title):
+
+       # Make key1|key2|key3|... out of our links keys
+       pattern = re.compile('|'.join(links.keys()))
+
+       # Use a lambda callback to substitute each occurance found
+       result = pattern.sub(lambda x: links[x.group()], content)
+
+       # Check for missing link targets, and report them to the user
+       match = re.findall('"@@.*"', result)
+
+       if len(match) > 0:
+               print('\nMissing link target' + ('s' if len(match) > 1 else '') + ' in "' + title + '":')
+
+               for s in match:
+                       print('  ' + s[3:-1])
+
+               print()
+
+       return result
+
+
+#
+# Recursively build a list of links based on the location of the page we're
+# looking at currently
+#
+def BuildList(lst, fs, pagePos, cList):
+       content = '\n\n<dl>\n'
+
+       for i in range(len(lst)):
+               curPos = lst[i]
+               nextPos = lst[i + 1] if i + 1 < len(lst)  else len(fs)
+
+               active = ' class=active' if curPos == pagePos else ''
+               content = content + '<dt' + active + '><a href="/' + fs[curPos]['filename'] + '/">' + fs[curPos]['title'] + '</a></dt><dd' + active + '>'
+
+               # If the current page is our page, and it has children, enumerate them
+               if curPos == pagePos:
+                       if len(cList[curPos]) > 0:
+                               content = content + BuildList(cList[curPos], fs, -1, cList)
+
+               # Otherwise, if our page lies between the current one and the next,
+               # build a list of links from those nodes one level down.
+               elif (pagePos > curPos) and (pagePos < nextPos):
+                       content = content + BuildList(cList[curPos], fs, pagePos, cList)
+
+               content = content + '</dd>\n'
+
+       content = content + '</dl>\n'
+
+       return content
+
+#
+# Create link sidebar given a position in the list.
+#
+def CreateLinkSidebar(fs, pos, childList):
+
+       # Build the list recursively from the top level nodes
+       content = BuildList(FindTopLevelNodes(fs), fs, pos, childList)
+       # Shove the TOC link in the top...
+       content = content[:7] + '<dt><a href="/toc/">Table of Contents</a></dt><dd></dd>\n' + content[7:]
+
+       return content
+
+
+# Preliminaries
+
+# We have command line arguments now, so deal with them
+parser = argparse.ArgumentParser(description='A build script for the Ardour Manual')
+parser.add_argument('-v', '--verbose', action='store_true', help='Display the high-level structure of the manual')
+parser.add_argument('-q', '--quiet', action='store_true', help='Suppress all output (overrides -v)')
+args = parser.parse_args()
+verbose = args.verbose
+quiet = args.quiet
+
+if quiet:
+       verbose = False
+
+#verbose = False
+level = 0
+fileCount = 0
+levelNums = [0]*6
+lastFile = ''
+page = ''
+toc = ''
+pageNumber = 0
+
+siteDir = './website/'
+
+if os.access(siteDir, os.F_OK):
+       if not quiet:
+               print('Removing stale HTML data...')
+
+       shutil.rmtree(siteDir)
+
+shutil.copytree('./source', siteDir)
+
+# Yeah, need to make a symlink in include/ too :-P
+# [this will go away when the rewrite happens]
+if (os.access('include/_manual', os.F_OK) == False):
+       os.symlink('../_manual/', 'include/_manual')
+
+
+# Read the template, and fix the stuff that's fixed for all pages
+temp = open('page-template.txt')
+template = temp.read()
+temp.close()
+
+template = template.replace('{{page.bootstrap_path}}', '/bootstrap-2.2.2')
+template = template.replace('{{page.page_title}}', 'The Ardour Manual')
+
+
+# Parse out the master docuemnt's structure into a dictionary list
+fileStruct = GetFileStructure()
+
+# Build a quasi-tree structure listing children at level + 1 for each node
+nodeChildren = FindChildren(fileStruct)
+
+# Create a dictionary for translation of internal links to real links
+links = FindInternalLinks(fileStruct)
+
+if not quiet:
+       print('Found ' + str(len(links)) + ' internal link target', end='')
+       print('.') if len(links) == 1 else print('s.')
+
+if not quiet:
+       master = open('master-doc.txt')
+       firstLine = master.readline().rstrip('\r\n')
+       master.close()
+
+       if firstLine == '<!-- exploded -->':
+               print('Parsing exploded file...')
+       elif firstLine == '<!-- imploded -->':
+               print('Parsing imploded file...')
+       else:
+               print('Parsing unknown type...')
+
+# Here we go!
+
+for header in fileStruct:
+       fileCount = fileCount + 1
+       content = ''
+       more = ''
+
+       lastLevel = level
+       level = header['level']
+
+       # Handle Part/Chapter/subchapter/section/subsection numbering
+       if level == 0:
+               levelNums[2] = 0
+       elif level == 1:
+               levelNums[2] = 0
+       elif level == 2:
+               levelNums[3] = 0
+       elif level == 3:
+               levelNums[4] = 0
+
+       levelNums[level] = levelNums[level] + 1;
+
+       # This is totally unnecessary, but nice; besides which, you can capture
+       # the output to a file to look at later if you like :-)
+       if verbose:
+               for i in range(level):
+                       print('\t', end='')
+
+               if (level == 0):
+                       print('\nPart ' + num2roman(levelNums[0]) + ': ', end='')
+               elif (level == 1):
+                       print('\n\tChapter ' + str(levelNums[1]) + ': ', end='')
+
+               print(header['title'])
+
+       # Handle TOC scriblings...
+       if level == 0:
+               toc = toc + '<h2>Part ' + num2roman(levelNums[level]) + ': ' + header['title'] + '</h2>\n';
+       elif level == 1:
+               toc = toc + '  <p id=chapter>Ch. ' + str(levelNums[level]) + ':&nbsp;&nbsp;<a href="/' + header['filename'] + '/">' + header['title'] + '</a></p>\n'
+       elif level == 2:
+               toc = toc + '    <a id=subchapter href="/' + header['filename'] + '/">' + header['title'] + '</a><br>\n'
+       elif level == 3:
+               toc = toc + '      <a id=subchapter href="/' + header['filename'] + '/">' + header['title'] + '</a><br>\n'
+       elif level == 4:
+               toc = toc + '      <a id=subchapter href="/' + header['filename'] + '/">' + header['title'] + '</a><br>\n'
+
+       # Make the 'this thing contains...' stuff
+       if HaveChildren(fileStruct, pageNumber):
+               pages = GetChildren(fileStruct, pageNumber)
+
+               for pg in pages:
+                       more = more + '<li>' + '<a href="/' + fileStruct[pg]['filename'] + '/">' + fileStruct[pg]['title'] + '</a>' + '</li>\n'
+
+               more = '<div id=subtopics>\n' + '<h2>This section contains the following topics:</h2>\n' + '<ul>\n' + more + '</ul>\n' + '</div>\n'
+
+       # Make the 'Previous' & 'Next' content
+       nLink = ''
+       pLink = ''
+
+       if pageNumber > 0:
+               pLink = '<li><a title="' + fileStruct[pageNumber - 1]['title'] + '" href="/' + fileStruct[pageNumber - 1]['filename'] + '/" class="previous"> &lt; Previous </a></li>'
+
+       if pageNumber < len(fileStruct) - 1:
+               nLink = '<li><a title="' + fileStruct[pageNumber + 1]['title'] + '" href="/' + fileStruct[pageNumber + 1]['filename'] + '/" class="next"> Next &gt; </a></li>'
+
+       prevnext = '<ul class=pager>' + pLink + nLink + '</ul>'
+
+       # Create the link sidebar
+       sidebar = CreateLinkSidebar(fileStruct, pageNumber, nodeChildren)
+
+       # Parts DO NOT have any content, they are ONLY an organizing construct!
+       # Chapters, subchapters, sections & subsections can all have content,
+       # but the basic fundamental organizing unit WRT content is still the
+       # chapter.
+       if level > 0:
+               if 'include' in header:
+                       srcFile = open('include/' + header['include'])
+                       content = srcFile.read()
+                       srcFile.close()
+
+                       # Get rid of any extant header in the include file
+                       # (once this is accepted, we can nuke this bit, as content files
+                       # will not have any headers or footers in them)
+                       content = re.sub('---.*\n(.*\n)*---.*\n', '', content)
+                       content = content.replace('{% children %}', '')
+
+               else:
+                       if 'content' in header:
+                               content = header['content']
+                       else:
+                               content = '[something went wrong]'
+
+       # Fix up any internal links
+       content = FixInternalLinks(links, content, header['title'])
+
+       # Set up the actual page from the template
+       if 'style' not in header:
+               page = re.sub("{% if page.style %}.*\n.*\n{% endif %}.*\n", "", template)
+       else:
+               page = template.replace('{{page.style}}', header['style'])
+               page = page.replace('{% if page.style %}', '')
+               page = page.replace('{% endif %}', '')
+
+       page = page.replace('{{ page.title }}', header['title'])
+       page = page.replace('{% tree %}', sidebar)
+       page = page.replace('{% prevnext %}', prevnext)
+       page = page.replace('{{ content }}', content + more)
+
+       # Create the directory for the index.html file to go into
+       os.mkdir(siteDir + header['filename'], 0o775)
+
+       # Finally, write the file!
+       destFile = open(siteDir + header['filename'] + '/index.html', 'w')
+       destFile.write(page)
+       destFile.close()
+
+       # Save filename for next header...
+       lastFile = header['filename']
+       pageNumber = pageNumber + 1
+
+# Finally, create the TOC
+sidebar = CreateLinkSidebar(fileStruct, -1, nodeChildren)
+
+page = re.sub("{% if page.style %}.*\n.*\n{% endif %}.*\n", "", template)
+page = page.replace('{{ page.title }}', 'Ardour Table of Contents')
+page = page.replace('{% tree %}', sidebar)
+page = page.replace('{{ content }}', toc)
+page = page.replace('{% prevnext %}', '')
+
+os.mkdir(siteDir + 'toc', 0o775)
+tocFile = open(siteDir + 'toc/index.html', 'w')
+tocFile.write(page)
+tocFile.close()
+
+if not quiet:
+       print('Processed ' + str(fileCount) + ' files.')
diff --git a/build.rb b/build.rb
deleted file mode 100755 (executable)
index 82693f1..0000000
--- a/build.rb
+++ /dev/null
@@ -1,285 +0,0 @@
-#!/usr/bin/env ruby
-
-require 'pathname'
-require 'yaml'
-require 'optparse'
-
-begin require 'liquid'
-rescue LoadError
-    puts "Please install the 'liquid' Ruby gem (available in Debian/Ubuntu as 'ruby-liquid')"
-    exit 1
-end
-
-CONFIG = {
-    pages_dir: '_manual',
-    layouts_dir: '_layouts',
-    static_dir: 'source',
-    output_dir: '_site'
-}
-
-def child_url?(a, b)
-    a.start_with?(b) && b.count('/') + 1 == a.count('/')
-end
-
-class Site
-    attr_reader :pages, :layouts
-
-    def initialize()
-        @pages = []
-        @layouts = {}
-    end
-    
-    def build()
-        print "Building... "
-
-        read_layouts()
-        read_pages()
-        copy_static()
-        process_pages()
-
-        puts "done."
-    end
-
-    def read_layouts()
-        Pathname.glob(layouts_dir + Pathname('*.html')) do |path|
-            next if !path.file?
-            layout = Layout.new(self, path)
-            layout.read
-            @layouts[path.basename('.html').to_s] = layout
-        end
-    end
-    
-    def read_pages()
-        pages_dir.find do |path|
-            if path.file? && path.extname == '.html'
-                page = Page.new(self, path)
-                page.read
-                @pages << page
-            end
-        end
-    end
-
-    def process_pages()
-        @pages.each {|page| page.process}
-    end
-    
-    def copy_static()
-        unless system("rsync -a --delete --exclude='*~' #{static_dir}/. #{output_dir}")
-            puts "Couldn't copy static files, is rsync installed?"
-        end
-    end
-    
-    def find_children(url)
-        sorted_pages.select { |p| child_url?(p.url, url) }
-    end
-    
-    def toplevel() @toplevel_memo ||= find_children('/') end
-    def sorted_pages() @sorted_pages_memo ||= @pages.sort_by{ |p| p.sort_url } end
-
-    def pages_dir() @pages_dir_memo ||= Pathname(CONFIG[:pages_dir]) end
-    def layouts_dir() @layouts_dir_memo ||= Pathname(CONFIG[:layouts_dir]) end
-    def static_dir() @static_dir_memo ||= Pathname(CONFIG[:static_dir]) end
-    def output_dir() @output_dir_memo ||= Pathname(CONFIG[:output_dir]) end
-end
-
-class Page
-    attr_reader :path, :out_path, :url, :sort_url
-
-    def initialize(site, path)
-        @site = site
-        @path = path
-
-       relative_path = @path.relative_path_from(@site.pages_dir);
-       a = relative_path.each_filename.map do |x|
-            x.sub(/^[0-9]*[-_]/, '')
-        end
-       a[-1].sub!(/\.html$/, '')
-        s = a.join('/')
-
-        @out_path = @site.output_dir + Pathname(s) + Pathname("index.html")
-        @url = "/#{s}/"
-        @sort_url = @path.to_s.sub(/\.html$/, '')
-    end
-
-    def related_to?(p)
-        # should we show p in the index on selfs page?
-        url.start_with?(p.url) || child_url?(url, p.url)
-    end
-
-    def title()
-        @page_context['title'] || ""
-    end
-
-    def menu_title()
-        @page_context['menu_title'] || title
-    end
-
-    def read()
-        content = @path.read
-        frontmatter, @content = split_frontmatter(content) || abort("File not well-formatted: #{@path}") 
-        @page_context = YAML.load(frontmatter)
-        @template = Liquid::Template.parse(@content)
-    end        
-
-    def split_frontmatter(txt)
-        @split_regex ||= /\A---[ \t\r]*\n(?<frontmatter>.*?)^---[ \t\r]*\n(?<content>.*)\z/m
-        match = @split_regex.match txt 
-        match ? [match['frontmatter'], match['content']] : nil
-    end
-    
-    def find_layout()
-        @site.layouts[@page_context['layout'] || 'default']
-    end
-
-    def children()
-        @children ||= @site.find_children(@url)
-    end
-    
-    def render()
-        registers = {page: self, site: @site}
-        context = {'page' => @page_context}
-        content = @template.render!(context, registers: registers)
-        find_layout.render(context.merge({'content' => content}), registers)
-    end
-    
-    def process()
-        path = out_path
-        path.dirname.mkpath
-        path.open('w') { |f| f.write(render) }
-    end
-end
-
-class Layout < Page
-    def render(context, registers)
-        context = context.dup
-        context['page'] = @page_context.merge(context['page'])
-        content = @template.render!(context, registers: registers)
-        if @page_context.has_key?('layout')
-            find_layout.render(context.merge({'content' => content}), registers)
-        else
-            content
-        end
-    end
-end
-
-class Tag_tree < Liquid::Tag
-    def join(children_html)
-        children_html.empty? ? "" : "<dl>\n" + children_html.join + "</dl>\n"
-    end
-
-    def render(context)
-        current = context.registers[:page]
-        site = context.registers[:site]
-
-        format_entry = lambda do |page|
-            children = page.children
-            
-            css = (page == current) ? ' class="active"' : ""
-            children_html = current.related_to?(page) ? join(children.map(&format_entry)) : ""
-            
-            %{
-          <dt#{css}>
-            <a href='#{page.url}'>#{page.menu_title}</a>
-          </dt>
-          <dd#{css}>
-            #{children_html}
-          </dd>
-        }
-        end
-
-        join(site.toplevel.map(&format_entry))
-    end
-end
-
-class Tag_children < Liquid::Tag
-    def render(context)
-        children = context.registers[:page].children
-        entries = children.map {|p| "<li><a href='#{p.url}'>#{p.title}</a></li>" }
-        
-        "<div id='subtopics'>
-        <h2>This chapter covers the following topics:</h2>
-        <ul>
-          #{entries.join}
-        </ul>
-        </div>
-      "
-    end
-end
-
-class Tag_prevnext < Liquid::Tag
-    def render(context)
-        current = context.registers[:page]
-        pages = context.registers[:site].sorted_pages
-        
-        index = pages.index { |page| page == current }
-        return '' if !index
-        
-        link = lambda do |p, cls, txt| 
-            "<li><a title='#{p.title}' href='#{p.url}' class='#{cls}'>#{txt}</a></li>"
-        end
-        prev_link = index > 0 ? link.call(pages[index-1], "previous", " &lt; Previous ") : ""
-        next_link = index < pages.length-1 ? link.call(pages[index+1], "next", " Next &gt; ") : ""
-        
-        "<ul class='pager'>#{prev_link}#{next_link}</ul>"
-    end
-end
-
-class Server
-    def start_watcher()
-        begin require 'listen'
-        rescue LoadError
-            puts "To use the --watch function, please install the 'listen' Ruby gem"
-            puts "(available in Debian/Ubuntu as 'ruby-listen')"
-            return nil
-        end
-
-        listener = Listen.to(CONFIG[:pages_dir], wait_for_delay: 1.0, only: /.html$/) do |modified, added, removed|
-            Site.new.build
-        end
-        listener.start
-        listener
-    end
-
-    def run(options)
-        require 'webrick'
-       listener = options[:watch] && start_watcher
-        port = options[:port] || 8000
-           
-        puts "Serving at http://localhost:#{port}/ ..."
-        server = WEBrick::HTTPServer.new :Port => port, :DocumentRoot => CONFIG[:output_dir]
-       trap 'INT' do 
-            server.shutdown 
-        end
-       server.start
-        listener.stop if listener
-    end  
-end
-
-def main
-    Liquid::Template.register_tag('tree', Tag_tree)
-    Liquid::Template.register_tag('children', Tag_children)
-    Liquid::Template.register_tag('prevnext', Tag_prevnext)
-
-    if defined? Liquid::Template.error_mode
-        Liquid::Template.error_mode = :strict
-    end
-
-    options = {}
-    OptionParser.new do |opts| 
-       opts.banner = %{Usage: build.rb <command> [options]
-
-Use 'build.rb' to build the manual.  Use 'build.rb serve' to also
-start a web server; setting any web server options implies "serve".
-}
-        opts.on("-w", "--watch", "Watch for changes") { options[:watch] = true }
-        opts.on("-p", "--port N", Integer, "Specify port for web server") { |p| options[:port] = p }
-    end.parse!
-
-    Site.new.build
-
-    if options[:watch] || options[:port] || (ARGV.length > 0 && "serve".start_with?(ARGV[0]))
-        Server.new.run(options)
-    end
-end
-
-main
diff --git a/explode.py b/explode.py
new file mode 100755 (executable)
index 0000000..a18ecee
--- /dev/null
@@ -0,0 +1,152 @@
+#!/usr/bin/python
+#
+# Small program to 'explode' the master document automagically into separate
+# files in the include/ directory.
+#
+# by James Hammons
+# (C) 2017 Underground Software
+#
+
+import os
+import re
+import shutil
+
+lineCount = 0
+
+
+#
+# Create an all lowercase filename without special characters and with spaces
+# replaced with dashes.
+#
+def MakeFilename(s):
+       # Cleans up the file name, removing all non ASCII or .-_ chars
+       fn = re.sub(r'[^.\-_a-zA-Z0-9 ]', '', s)
+       fn = fn.lower()
+       fn = fn.replace(' ', '-')
+       return fn
+
+
+#
+# Parse headers into a dictionary
+#
+def ParseHeader(fileObj):
+       global lineCount
+       header = {}
+
+       while (True):
+               hdrLine = fileObj.readline().rstrip('\r\n')
+               lineCount = lineCount + 1
+
+               # Break out of the loop if we hit the end of header marker
+               if hdrLine.startswith('---'):
+                       break
+
+               # Check to see that we have a well-formed header construct
+               match = re.findall(': ', hdrLine)
+
+               if match:
+                       # Parse out foo: bar pairs & put into header dictionary
+                       a = re.split(': ', hdrLine, 1)
+                       header[a[0]] = a[1]
+
+       return header
+
+
+fileCount = 0
+writingFile = False
+toFile = open('master-doc.txt')
+toFile.close()
+filenames = []
+
+
+master = open('master-doc.txt')
+firstLine = master.readline().rstrip('\r\n')
+master.close()
+
+if firstLine == '<!-- exploded -->':
+       print('Master file has already been exploded.')
+       exit(0)
+
+if os.rename('master-doc.txt', 'master-doc.bak') == False:
+       print('Could not rename master-doc.txt!')
+       exit(-1)
+
+master = open('master-doc.bak', 'r')
+explode = open('master-doc.txt', 'w')
+
+explode.write('<!-- exploded -->\n')
+
+for line in master:
+       lineCount = lineCount + 1
+
+       # Do any header parsing if needed...
+       if line.startswith('---'):
+
+               # Close any open file from the previous header
+               if (writingFile):
+                       toFile.close()
+                       writingFile = False
+
+               noMove = False
+               header = ParseHeader(master)
+
+               # Make sure the filename we're making is unique...
+               basename = MakeFilename(header['title'])
+               inclFile = basename + '.html'
+
+               if 'file' in header:
+                       inclFile = header['file']
+               else:
+                       suffix = 1
+
+                       while inclFile in filenames:
+                               suffix = suffix + 1
+                               inclFile = basename + '_' + str(suffix) + '.html'
+
+               # Find all files in the master file and write them out to include/,
+               # while removing it from the master file.
+               explode.write('\n---\n' + 'title: ' + header['title'] + '\n')
+
+               if header['part'] != 'part':
+                       if 'menu_title' in header:
+                               explode.write('menu_title: ' + header['menu_title'] + '\n')
+
+                       if 'link' in header:
+                               explode.write('link: ' + header['link'] + '\n')
+
+                       if 'style' in header:
+                               explode.write('style: ' + header['style'] + '\n')
+
+                       if 'include' in header:
+                               noMove = True
+                               explode.write('include: ' + header['include'] + '\n')
+                               explode.write('exclude: yes\n')
+                               filenames.append(header['include'])
+                       else:
+                               explode.write('include: ' + inclFile + '\n')
+                               filenames.append(inclFile)
+
+               explode.write('part: ' + header['part'] + '\n' + '---\n')
+
+               # Only parts have no content...
+               if header['part'] != 'part':
+                       if noMove:
+                               explode.write('\n')
+                       else:
+                               fileCount = fileCount + 1
+
+                               toFile = open('include/' + inclFile, 'w')
+                               writingFile = True
+
+       else:
+               if writingFile:
+                       toFile.write(line)
+
+master.close()
+explode.close()
+
+print('Processed ' + str(lineCount) + ' lines.')
+print('Exploded master document into ' + str(fileCount) + ' files.')
+
+os.remove('master-doc.bak')
+
diff --git a/implode.py b/implode.py
new file mode 100755 (executable)
index 0000000..fcc0e21
--- /dev/null
@@ -0,0 +1,152 @@
+#!/usr/bin/python
+#
+# Small program to 'implode' the master document automagically from separate
+# files in the include/ directory.
+#
+# by James Hammons
+# (C) 2017 Underground Software
+#
+
+import os
+import re
+import shutil
+
+lineCount = 0
+
+
+#
+# Parse headers into a dictionary
+#
+def ParseHeader(fileObj):
+       global lineCount
+       header = {}
+
+       while (True):
+               hdrLine = fileObj.readline().rstrip('\r\n')
+               lineCount = lineCount + 1
+
+               # Break out of the loop if we hit the end of header marker
+               if hdrLine.startswith('---'):
+                       break
+
+               # Check to see that we have a well-formed header construct
+               match = re.findall(': ', hdrLine)
+
+               if match:
+                       # Parse out foo: bar pairs & put into header dictionary
+                       a = re.split(': ', hdrLine, 1)
+                       header[a[0]] = a[1]
+
+       return header
+
+
+#
+# Check to see if a given file has a header (it shouldn't)
+#
+def CheckForHeader(fn):
+       check = open(fn)
+
+       for line in check:
+               if line.startswith('---'):
+                       check.close()
+                       return True
+
+       check.close()
+       return False
+
+
+fileCount = 0
+delList = []
+
+master = open('master-doc.txt')
+firstLine = master.readline().rstrip('\r\n')
+master.close()
+
+if firstLine == '<!-- imploded -->':
+       print('Master file has already been imploded.')
+       exit(0)
+
+if os.rename('master-doc.txt', 'master-doc.bak') == False:
+       print('Could not rename master-doc.txt!')
+       exit(-1)
+
+master = open('master-doc.bak', 'r')
+implode = open('master-doc.txt', 'w')
+
+implode.write('<!-- imploded -->\n')
+
+for line in master:
+       lineCount = lineCount + 1
+
+       # Do any header parsing if needed...
+       if line.startswith('---'):
+
+               noMove = False
+               header = ParseHeader(master)
+
+               # Pull in files and write the result to the master file
+               implode.write('\n---\n' + 'title: ' + header['title'] + '\n')
+
+               if header['part'] != 'part':
+                       if 'menu_title' in header:
+                               implode.write('menu_title: ' + header['menu_title'] + '\n')
+
+                       if 'link' in header:
+                               implode.write('link: ' + header['link'] + '\n')
+
+                       if 'style' in header:
+                               implode.write('style: ' + header['style'] + '\n')
+
+                       implode.write('file: ' + header['include'] + '\n')
+
+                       if ('exclude' in header) and ('include' in header):
+                               noMove = True
+                               implode.write('include: ' + header['include'] + '\n')
+                               implode.write('exclude: yes\n')
+
+               implode.write('part: ' + header['part'] + '\n' + '---\n')
+
+               # Only parts have no content...
+               if header['part'] != 'part':
+                       if noMove:
+                               implode.write('\n')
+                       else:
+                               fileCount = fileCount + 1
+                               inclFile = 'include/' + header['include']
+
+                               try:
+                                       fromFile = open(inclFile)
+                               except (FileNotFoundError):
+                                       print('Could not find include file "include/' + header['include'] + '"; aborting!')
+                                       os.remove('master-doc.txt')
+                                       os.rename('master-doc.bak', 'master-doc.txt')
+                                       exit(-1)
+
+#eventually this will go away, as this will never happen again...
+                               if CheckForHeader(inclFile) == True:
+
+                                       # Skip the header
+                                       while fromFile.readline().startswith('---') == False:
+                                               pass
+
+                                       ln = fromFile.readline()
+
+                                       while fromFile.readline().startswith('---') == False:
+                                               pass
+
+                               shutil.copyfileobj(fromFile, implode)
+                               fromFile.close()
+                               delList.append(inclFile)
+
+master.close()
+implode.close()
+
+print('Processed ' + str(lineCount) + ' lines.')
+print('Imploded master document from ' + str(fileCount) + ' files.')
+
+# Cleanup after successful implode
+os.remove('master-doc.bak')
+
+for name in delList:
+       os.remove(name)
+
diff --git a/import.rb b/import.rb
deleted file mode 100644 (file)
index b3e58d7..0000000
--- a/import.rb
+++ /dev/null
@@ -1,229 +0,0 @@
-require 'nokogiri'
-require 'fileutils'
-require 'open-uri'
-
-URL = 'http://ardour.org/book/export/html/5848'
-FILENAME = 'drupal-export.html'
-
-WRITE = true
-DOWNLOAD_FILES = false
-GET_ARDOUR_ORG_IMAGES = false
-HANDLE_OTHER_IMAGES = false
-
-OUTPUT_DIR = '_manual'
-
-FILES_DIR = 'source'
-
-SLUG_MAPPINGS = {
-    'working_with_sessions' => 'sessions',
-    'export_stem' => 'export',
-    'track_groups' => 'track_bus_groups',
-    'vst_support' => 'windows_vst',
-    'kbd_default' => 'default_bindings',
-    'midistep_entry' => 'midi_step_entry',
-    'midi_stepentry' => 'midi_step_entry'
-}
-
-MISSING_SLUGS = %w(
-    range_selection
-    track_templates
-    track_template
-    color_dialog
-    region_layering
-    round_robin_inputs
-    mcp_osx
-    mcp_new_device
-)
-
-FILES_MAPPINGS = {
-    '/files/a3_mnemonic_cheatsheet.pdf' => '/files/ardour-2.8.3-bindings-x.pdf',
-    '/files/a3_mnemonic_cheat_sheet_osx.pdf' => '/files/ardour-2.8.3-bindings-osx-a4.pdf'
-}
-
-LINK_SLUG_TO_NODE_ID = {}
-
-def link_slug_to_node_id(slug)
-
-    slug = SLUG_MAPPINGS[slug] || slug
-
-    return nil if MISSING_SLUGS.include? slug
-
-    LINK_SLUG_TO_NODE_ID[slug] ||= begin
-        filename = "tmp/slug-to-node/#{slug}"
-
-        if File.exists? filename
-            File.read(filename).to_i
-        else
-            url = "http://ardour.org/manual/#{slug}"
-            puts "opening #{url}"
-            node_id = Nokogiri(open(url)).at('#content .node')['id'].sub(/^node\-/,'').to_i
-            File.open(filename,'w+') { |f| f << node_id }
-            node_id
-        end
-    end
-end
-
-
-def register_node(node_id, path)
-    filename = "tmp/node-to-path/#{node_id}"
-    File.open(filename,'w+') { |f| f << path } unless File.exists? filename
-end
-
-def node_id_to_path!(node_id)
-    filename = "tmp/node-to-path/#{node_id}"
-    return '' unless File.exists? filename
-    #raise "no path for node-id #{node_id}" unless File.exists? filename
-    File.read(filename)
-end
-
-def process(html, level = 1, path = [], numbered_path = [])
-    html.search("div.section-#{level}").each_with_index do |child, i|
-
-        title = child.at('h1.book-heading').inner_text
-
-        node_id = child['id'].sub(/^node\-/,'')
-
-
-        slug = title.downcase.gsub(' ','-').gsub(/[^a-z0-9\-]/, '')
-
-        root = slug == 'the-ardour3-manual'
-
-        if root
-
-            # top level
-
-            this_path = []
-            this_numbered_path = []
-        else
-            numbered_slug = "%02d_%s" % [i + 1, slug, node_id]
-
-            this_path = path + [slug]
-            this_numbered_path = numbered_path + [numbered_slug]
-        end
-
-        register_node node_id, this_path.join('/')
-
-        indent = ' ' * level * 3
-
-        has_children = child.search("div.section-#{level + 1}").length > 0 #&& possible_children.any? { |child| child.search('div').length > 0 }
-
-        output_dir = "#{OUTPUT_DIR}/#{this_numbered_path.join('/')}"
-
-        output_file = case 
-        when root
-            "#{OUTPUT_DIR}/blah.html"
-        #when has_children
-        #    "#{output_dir}/index.html"
-        else
-            "#{output_dir}.html"
-        end
-
-        content = child.dup
-
-        content.search('h1.book-heading').remove
-        content.search("div.section-#{level + 1}").remove
-
-        if heading = content.at('h2') and heading.inner_text == title
-            heading.remove
-        end
-
-        #puts "processing links in [#{this_path.join('/')}]"
-
-        content.search('a').each do |a|
-            href = a['href']
-            case href
-            when /^\/manual\/(.*)/
-                slug = $1
-                if node_id = link_slug_to_node_id(slug)
-                    link_path = node_id_to_path! node_id
-                    #puts " link slug [#{slug}] -> #{node_id} -> #{link_path}"
-                    a['href'] = "/#{link_path}"
-                else
-                    a['href'] = "/missing"
-                end
-
-            when /^(\/files\/.*)/
-
-                if DOWNLOAD_FILES
-                    file_path = $1
-
-
-                    if FILES_MAPPINGS[file_path]
-                        file_path = FILES_MAPPINGS[file_path]
-                        a['href'] = file_path
-                    end
-
-                    puts "downloading [#{file_path}] (for #{this_path.join('/')})"
-
-                    filename = "#{FILES_DIR}/#{file_path}"
-                    FileUtils.mkdir_p File.dirname(filename)
-                    File.open(filename,'w+') { |f| f << open("http://ardour.org/#{file_path}").read }
-                end
-            end
-        end
-
-        content.search('img').each do |img|
-
-            src = img['src']
-
-            case src
-            when /^\//
-                if GET_ARDOUR_ORG_IMAGES
-                    url = "http://ardour.org#{src}"
-                    puts "getting #{url}"
-                    img_path = "#{FILES_DIR}#{src}"
-                    FileUtils.mkdir_p File.dirname(img_path)
-                    File.open(img_path, 'w+') { |f| f << open(url).read }
-                end
-            when /^http/
-                new_src = '/' + src.sub(/^http:\/\/[^\/]+\//,'')
-                img['src'] = new_src
-                    
-                if HANDLE_OTHER_IMAGES
-                    puts "new_src: #{new_src}"
-                    img_path = "#{FILES_DIR}#{new_src}"
-                    FileUtils.mkdir_p File.dirname(img_path)
-                    puts "getting #{src}"
-                    File.open(img_path, 'w+') { |f| f << open(src).read }
-                end
-            end
-
-        end
-
-        if WRITE
-            FileUtils.mkdir_p output_dir if has_children
-            File.open(output_file, 'w:UTF-8') do |f| 
-                f << <<-HTML
----
-layout: default
-title: #{title}
----                        
-
-#{content.inner_html}
-                HTML
-
-                if has_children
-                    f << <<-HTML
-{% children %}
-                    HTML
-                end
-
-
-            end
-        end
-
-        process(child, level + 1, this_path, this_numbered_path)
-    end
-end
-
-
-unless File.exists?(FILENAME)
-    puts "downloading #{URL} to #{FILENAME}"
-    File.open(FILENAME,'w+') { |f| f << open(URL).read }
-end
-
-FileUtils.mkdir_p('tmp/node-to-path')
-FileUtils.mkdir_p('tmp/slug-to-node')
-
-process Nokogiri(File.read(FILENAME))
-
diff --git a/include/ardour-concepts.html b/include/ardour-concepts.html
new file mode 100644 (file)
index 0000000..09e5b51
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Ardour Concepts
+---
+
+
diff --git a/include/ardour-setup-for-surround.html b/include/ardour-setup-for-surround.html
new file mode 100644 (file)
index 0000000..fcacfb4
--- /dev/null
@@ -0,0 +1,7 @@
+---
+title: Ardour Setup for Surround
+---
+
+<p class="fixme">Add content</p>
+
+
diff --git a/include/ardour-systems.html b/include/ardour-systems.html
new file mode 100644 (file)
index 0000000..11a03f9
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Ardour Systems
+---
+
+
diff --git a/include/arranging-regions.html b/include/arranging-regions.html
new file mode 100644 (file)
index 0000000..a8c8c8a
--- /dev/null
@@ -0,0 +1,7 @@
+---
+title: Arranging Regions
+---
+
+<p class="fixme">Add content</p>
+
+
diff --git a/include/audio-recording.html b/include/audio-recording.html
new file mode 100644 (file)
index 0000000..34e806b
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Audio Recording
+---
+
+
diff --git a/include/automation.html b/include/automation.html
new file mode 100644 (file)
index 0000000..3342b90
--- /dev/null
@@ -0,0 +1,7 @@
+---
+title: Automation
+---
+
+<p class="fixme">Add content</p>
+
+
diff --git a/include/basic-mixing.html b/include/basic-mixing.html
new file mode 100644 (file)
index 0000000..5995b87
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Basic Mixing
+---
+
+
diff --git a/include/clocks.html b/include/clocks.html
new file mode 100644 (file)
index 0000000..6f3505d
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Clocks
+---
+
+
diff --git a/include/configuring-midi.html b/include/configuring-midi.html
new file mode 100644 (file)
index 0000000..94c80ba
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Configuring MIDI
+---
+
+
diff --git a/include/controls.html b/include/controls.html
new file mode 100644 (file)
index 0000000..48460ea
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Controls
+---
+
+
diff --git a/include/edit-mode-and-tools.html b/include/edit-mode-and-tools.html
new file mode 100644 (file)
index 0000000..b65f57a
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Edit Mode and Tools
+---
+
+
diff --git a/include/editing-basics.html b/include/editing-basics.html
new file mode 100644 (file)
index 0000000..df12127
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Editing Basics
+---
+
+
diff --git a/include/editing-regions-and-selections.html b/include/editing-regions-and-selections.html
new file mode 100644 (file)
index 0000000..aa602ea
--- /dev/null
@@ -0,0 +1,4 @@
+---
+title: Editing Regions and Selections
+---
+
diff --git a/include/fades-and-crossfades.html b/include/fades-and-crossfades.html
new file mode 100644 (file)
index 0000000..5bd005d
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Fades and Crossfades
+---
+
+
diff --git a/include/favorite-plugins-window.html b/include/favorite-plugins-window.html
new file mode 100644 (file)
index 0000000..6e83d38
--- /dev/null
@@ -0,0 +1,35 @@
+---
+title: Favorite Plugins Window
+---
+
+<img class="right" src="/images/favorite-plugins.png" alt="Favorite Plugins wind
+ow">
+
+<p>
+  The <dfn>Favorite Plugins</dfn> window is on the top-left side of the <dfn>Mixer Window</dfn>. Like other elements in that window it has variable height and can be hidden by dragging it to zero-height. If it is not visible, the top-handle can be grabbed and dragged down to reveal it.
+</p>
+
+<p>
+  Plugin names that have a right facing triangle next to them have presets associated with them; clicking on the triangle will cause all presets associated with the plugin to show in the list.
+</p>
+
+<h2>Features</h2>
+
+<img class="right" src="/images/mixer-to-fav-dnd.png" alt="Dragging plugin to Favorites window">
+<p>
+  The Favorite Plugins window provides easy access to frequently used plugins:
+</p>
+
+<ul>
+  <li>Plugins can be dragged from the window to any track or bus <a href="@@processor-box"><dfn>processor box</dfn></a>, which will add the plugin to that track or bus at the given position.</li>
+  <li>The list includes user-presets for the plugins. Dragging a preset to a given track or bus will load that preset after adding the plugin.</li>
+  <li>Double-clicking on a plugin or preset adds the given plugin to all selected tracks/busses pre-fader. Other insert positions are available from the context menu (right click).</li>
+  <li>Dragging a plugin from a track into the window will add it to the list and optionally create a new preset from the current settings. The horizontal line in the list shows the spot where the plugin will land.</li>
+  <li>The context-menu allows the deletion of presets or removal of the plugin from the list.</li>
+  <li>Plugins in the list can be re-ordered using drag &amp; drop. The custom order is saved.</li>
+</ul>
+
+<p class="note">
+  When favorites are added with the <a href="@@plugin-manager">Plugin Manager</a>, they are appended to the bottom of the list.
+</p>
+
diff --git a/include/file-and-session-management-and-compatibility.html b/include/file-and-session-management-and-compatibility.html
new file mode 100644 (file)
index 0000000..3eca224
--- /dev/null
@@ -0,0 +1,7 @@
+---
+title: File and Session Management and Compatibility
+---
+
+<p class="fixme">Add content</p>
+
+
diff --git a/include/grouping-tracks.html b/include/grouping-tracks.html
new file mode 100644 (file)
index 0000000..082e445
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Grouping Tracks
+---
+
+
diff --git a/include/i_o-setup.html b/include/i_o-setup.html
new file mode 100644 (file)
index 0000000..89b4e4a
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: I/O Setup
+---
+
+
diff --git a/include/importing-and-exporting-session-data.html b/include/importing-and-exporting-session-data.html
new file mode 100644 (file)
index 0000000..a56dce2
--- /dev/null
@@ -0,0 +1,7 @@
+---
+title: Importing and Exporting Session Data
+---
+
+<p class="fixme">Add content</p>
+
+
diff --git a/include/kde-plasma-5.html b/include/kde-plasma-5.html
new file mode 100644 (file)
index 0000000..dc15947
--- /dev/null
@@ -0,0 +1,61 @@
+---
+title: KDE Plasma 5
+---
+
+<p>
+  Under <dfn>KDE Plasma 5</dfn>, plugin and various other windows will not stay
+  on top of any main window; therefore a workaround is required.
+</p>
+
+<h2>Workaround for ancillary windows not staying on top in KDE Plasma 5</h2>
+
+<p>
+  In order to force ancillary windows in Ardour to stay on top, the following
+  steps are necessary:
+</p>
+
+<ol>
+  <li>Launch the <kbd class="menu">System Settings</kbd> application.</li>
+  <li>Open <kbd class="menu">Workspace &gt; Window Managment</kbd>.</li>
+  <li>Select <kbd class="menu">Window Rules</kbd> in the left-hand sidebar. It
+  should default to the <kbd class="menu">Window matching</kbd> tab.</li>
+  <li>Click on the <kbd class="menu">New...</kbd> button.</li>
+  <li>On the line that says <kbd class="menu">Window class (application)</kbd>,
+  set the combo box to <kbd class="menu">Substring Match</kbd> and type <kbd
+  class="user">ardour</kbd> in the text entry field.</li>
+  <li>In the list box that is labeled <kbd class="menu">Window types:</kbd>,
+  click on the option <kbd class="menu">Dialog Window</kbd>, then press and
+  hold <kbd>Ctrl</kbd> while clicking on the second option <kbd
+  class="menu">Utility Window</kbd>.</li>
+  <li>Select the <kbd class="menu">Arrangement & Access</kbd> tab.</li>
+  <li>Check the box next to the <kbd class="menu">Keep above</kbd> option. On
+  the same line, select <kbd class="menu">Force</kbd> from the combo box, then
+  click on the <kbd class="menu">Yes</kbd> radio button for that line.</li>
+  <li>Click on the <kbd class="menu">OK</kbd> button to dismiss the dialog.
+  </li>
+</ol>
+
+<p>
+  At this point you can close the <kbd class="menu">System Settings</kbd>
+  application.
+</p>
+
+<h3>Background Info</h3>
+
+<p>
+  <a href="https://bugs.kde.org/show_bug.cgi?id=172615#c26">According to one of
+  the lead KDE developers</a>, they are not willing to follow the <abbr
+  title="Inter-Client Communication Conventions Manual">ICCCM</abbr> standard
+  for utility windows. Apparently they are alone in this understanding, as
+  plugin windows on Ardour under Linux work out of the box on every other <abbr
+  title="Window Manager">WM</abbr> out there.
+</p>
+
+<p>
+  Under KDE 4, there was a workaround in Ardour (<kbd class="menu">Preferences
+  &gt; Theme &gt; All floating windows are dialogs</kbd>) that would "trick"
+  KDE into forcing certain window types to be on top of their parent windows,
+  but this no longer works under KDE Plasma 5.
+</p>
+
+
diff --git a/include/keyboard-and-mouse-shortcuts.html b/include/keyboard-and-mouse-shortcuts.html
new file mode 100644 (file)
index 0000000..25763a6
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Keyboard and Mouse Shortcuts
+---
+
+
diff --git a/include/lua-scripting-in-ardour.html b/include/lua-scripting-in-ardour.html
new file mode 100644 (file)
index 0000000..9549710
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Lua Scripting in Ardour
+---
+
+
diff --git a/include/making-selections.html b/include/making-selections.html
new file mode 100644 (file)
index 0000000..266869b
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Making Selections
+---
+
+
diff --git a/include/memory-locations.html b/include/memory-locations.html
new file mode 100644 (file)
index 0000000..2fcd867
--- /dev/null
@@ -0,0 +1,7 @@
+---
+title: Memory Locations
+---
+
+<p class="fixme">Add content</p>
+
+
diff --git a/include/midi-editing.html b/include/midi-editing.html
new file mode 100644 (file)
index 0000000..5b46275
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: MIDI Editing
+---
+
+
diff --git a/include/midi-editors.html b/include/midi-editors.html
new file mode 100644 (file)
index 0000000..8196ff7
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: MIDI Editors
+---
+
+
diff --git a/include/midi-event-list.html b/include/midi-event-list.html
new file mode 100644 (file)
index 0000000..f5368f4
--- /dev/null
@@ -0,0 +1,8 @@
+---
+title: MIDI Event List
+---
+
+
+
+
+
diff --git a/include/midi-recording.html b/include/midi-recording.html
new file mode 100644 (file)
index 0000000..233180d
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: MIDI Recording
+---
+
+
diff --git a/include/mixdown.html b/include/mixdown.html
new file mode 100644 (file)
index 0000000..24b0d43
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Mixdown
+---
+
+
diff --git a/include/mixer-strips.html b/include/mixer-strips.html
new file mode 100644 (file)
index 0000000..7e82974
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Mixer Strips
+---
+
+
diff --git a/include/multichannel-tracks-and-signal-routing.html b/include/multichannel-tracks-and-signal-routing.html
new file mode 100644 (file)
index 0000000..5a816ff
--- /dev/null
@@ -0,0 +1,7 @@
+---
+title: Multichannel Tracks and Signal Routing
+---
+
+<p class="fixme">Add content</p>
+
+
diff --git a/include/playing-back-track-material.html b/include/playing-back-track-material.html
new file mode 100644 (file)
index 0000000..a4692c0
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Playing Back Track Material
+---
+
+
diff --git a/include/playlists.html b/include/playlists.html
new file mode 100644 (file)
index 0000000..4d12f78
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Playlists
+---
+
+
diff --git a/include/plugin-and-hardware-inserts.html b/include/plugin-and-hardware-inserts.html
new file mode 100644 (file)
index 0000000..e647238
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Plugin and Hardware Inserts
+---
+
+
diff --git a/include/plugins-bundled-with-ardour.html b/include/plugins-bundled-with-ardour.html
new file mode 100644 (file)
index 0000000..bafa92b
--- /dev/null
@@ -0,0 +1,31 @@
+---
+title: Plugins Bundled With Ardour
+---
+
+<p>
+  Ardour now comes with the following plugins as part of a standard installation:
+</p>
+
+<dl class="narrower-table">
+  <dt>a-Amplifier</dt>
+  <dd>A versatile &plusmn;20dB multichannel amplifier</dd>
+  <dt>a-Compressor</dt>
+  <dd>A side-chain enabled compressor with the usual controls. Comes in stereo and mono versions</dd>
+  <dt>a-Delay</dt>
+  <dd>A basic single-tap delay line, with tempo sync</dd>
+  <dt>a-EQ</dt>
+  <dd>A nice sounding 4-band parametric EQ with shelves</dd>
+  <dt>a-Fluid Synth</dt>
+  <dd>Wraps the Fluidsynth SoundFont2 synthesis engine as a new sample player</dd>
+  <dt>a-High/Low Pass Filter</dt>
+  <dd>Independent high and low pass filters with steepness up to 48dB/octave</dd>
+  <dt>a-Inline Scope</dt>
+  <dd>A mixer strip inline waveform display</dd>
+  <dt>a-Inline Spectrogram</dt>
+  <dd>A mixer strip inline specturm display</dd>
+  <dt>a-MIDI Monitor</dt>
+  <dd>A mixer strip inline display to show recent <abbr title="Musical Instrument Digital Interface">MIDI</abbr> events</dd>
+  <dt>a-Reverb</dt>
+  <dd>A reverb that finds a balance between sounding good, using a lot of CPU and having too many controls</dd>
+</dl>
+
diff --git a/include/preferences.html b/include/preferences.html
new file mode 100644 (file)
index 0000000..0e30f4c
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Preferences
+---
+
+
diff --git a/include/punch-recording-modes.html b/include/punch-recording-modes.html
new file mode 100644 (file)
index 0000000..9495e33
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Punch Recording Modes
+---
+
+
diff --git a/include/record-setup.html b/include/record-setup.html
new file mode 100644 (file)
index 0000000..356a5f4
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Record Setup
+---
+
+
diff --git a/include/region-loops-and-groups.html b/include/region-loops-and-groups.html
new file mode 100644 (file)
index 0000000..274cf7a
--- /dev/null
@@ -0,0 +1,7 @@
+---
+title: Region Loops and Groups
+---
+
+<p class="fixme">Add content</p>
+
+
diff --git a/include/rhythm-ferret.html b/include/rhythm-ferret.html
new file mode 100644 (file)
index 0000000..894b3f4
--- /dev/null
@@ -0,0 +1,7 @@
+---
+title: Rhythm Ferret
+---
+
+<p class="fixme">Add content</p>
+
+
diff --git a/include/score-editor.html b/include/score-editor.html
new file mode 100644 (file)
index 0000000..1d50ffa
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Score Editor
+---
+
+
diff --git a/include/sessions.html b/include/sessions.html
new file mode 100644 (file)
index 0000000..4f4b84e
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Sessions
+---
+
+
diff --git a/include/surround-panning-and-mixing.html b/include/surround-panning-and-mixing.html
new file mode 100644 (file)
index 0000000..2adf828
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Surround Panning and Mixing
+---
+
+
diff --git a/include/system-setup.html b/include/system-setup.html
new file mode 100644 (file)
index 0000000..6a4e449
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: System Setup
+---
+
+
diff --git a/include/techniques-for-working-with-tempo-and-meter.html b/include/techniques-for-working-with-tempo-and-meter.html
new file mode 100644 (file)
index 0000000..1cf1b1f
--- /dev/null
@@ -0,0 +1,88 @@
+---
+title: Techniques for Working with Tempo and Meter
+---
+
+<h3>Techniques </h3>
+
+<p>
+  As a general approach, the best way to control tempo ramps is to use them in pairs.
+</p>
+
+<p>
+  Lets imagine we want to match the click to a drum performance recorded in 'free time'.
+</p>
+
+<p>
+  The first thing we need to do is determine where the first beat is. Drag the first meter to that position.
+</p>
+
+<p>
+  Now the first click will be in time with the first beat. To get all the other beats to align, we listen to the drums and visually locate the position of bar 4. You may wish to place the playhead here.
+</p>
+
+<p>
+  We then locate bar 4 in the BBT ruler and while holding the constraint modifier, drag it to bar 4 in the drum performance.
+</p>
+
+<p>
+  We notice that the click now matches the first 4 bars, but after that it wanders off. You will see this reflected in the tempo lines.. they won't quite match the drum hits. We now locate the earliest position where the click doesn't match, and place a new tempo just before this. Two bars later, place another new tempo.
+</p>
+
+<p>
+  Now while dragging any beat <strong>after</strong> the second new tempo, watch the drum audio and tempo lines until they align.
+</p>
+
+<p class="note">
+  Notice what is happening here: the tempo previous to your mouse pointer is being changed so that the beat you grabbed aligns with the pointer. Notice that the tempo lines previous to the changed one also move. This is because the previous tempo is ramping <strong>to</strong> the tempo you are changing. Look further to the left. The tempo lines in the first four bars do not move.
+</p>
+
+<p>
+  Again, some time later the click will not align. I didn't say this was easy.
+</p>
+
+<p>
+  Repeat the same technique: add two new tempos and drag the BBT ruler <strong>after</strong> the newest tempo so that the beats align with the audio again.
+</p>
+
+<p>
+  In a general sense, adding tempo markers in pairs allows you to 'pin' your previous work while you move further to the right.
+</p>
+
+<h3>Another use case: matching accelerando</h3>
+
+<p>
+  Imagine you have some video and have located where your music cue begins. Move the first meter to that frame (you may snap to TC frames, but not music with an audio locked meter).
+</p>
+
+<p>
+  Find a starting tempo by listening to the click while you drag the meter's tempo vertically using the constraint modifier.
+</p>
+
+<p>
+  You have the playhead at point where the dude slams the phone down, and your idea was that 4|1|0 would be good for this, but you want an accelerando to that point.
+</p>
+
+<p>
+  Add a tempo at bar 4.
+</p>
+
+<p>
+  Holding down the constraint modifier, and with snap set to 'TC Frames', grab the BBT ruler just <strong>after</strong> 4|1|0. Drag the ruler so that 4|1|0 snaps to the 'phone' frame.
+</p>
+
+<p class="note">
+  Notice what happened: The second tempo was changed.<br />
+  You had set a musical position for the second tempo marker. It was not aligned with the frame you wanted, so you dragged the BBT ruler, making the second tempo provide enough pulses over the ramp for 4|1|0 to align with the desired frame.
+</p>
+
+<p>
+  If the ramp doesn't feel right, you may add more points within it and keep adjusting beat positions in a similar manner.
+</p>
+
+<h3>General</h3>
+
+<p>
+  Audio locked meters can be useful when composing, as they allow a continuous piece of music to be worked on in isolated segments, preventing the listening fatigue of a fixed form. Reassembly is left as an excercise for the reader.
+</p>
+
+
diff --git a/include/time_-tempo-and-meter.html b/include/time_-tempo-and-meter.html
new file mode 100644 (file)
index 0000000..5c3fd26
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Time, Tempo and Meter
+---
+
+
diff --git a/include/tracks.html b/include/tracks.html
new file mode 100644 (file)
index 0000000..233c26d
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Tracks
+---
+
+
diff --git a/include/using-key-bindings.html b/include/using-key-bindings.html
new file mode 100644 (file)
index 0000000..80e7f00
--- /dev/null
@@ -0,0 +1,31 @@
+---
+title: Using Key Bindings
+---
+
+<p>
+  Ardour has many available commands for playback control that can be bound
+  to keys. Many of them have default bindings, some do not, so the list below
+  shows both the default bindings and internal command names.
+</p>
+
+<dl class="wide-table">
+  <dt><kbd>Space</kbd></dt>
+  <dd>switch between playback and stop.</dd>
+  <dt><kbd>Home</kbd></dt>
+  <dd>Move playhead to session start marker</dd>
+  <dt><kbd>End</kbd></dt>
+  <dd>Move playhead to session end marker</dd>
+  <dt><kbd>&rarr;</kbd></dt>
+  <dd></dd>
+  <dt><kbd>&larr;</kbd></dt>
+  <dd></dd>
+  <dt><kbd>0</kbd></dt>
+  <dd>Move playhead to start of the timeline</dd>
+</dl>
+
+<p>Commands without default bindings include:</p>
+
+<p class="fixme">Add content</p>
+
+
+
diff --git a/include/welcome-to-ardour.html b/include/welcome-to-ardour.html
new file mode 100644 (file)
index 0000000..7db80b7
--- /dev/null
@@ -0,0 +1,4 @@
+---
+title: Welcome to Ardour
+---
+
diff --git a/include/working-with-field-recorders-in-ardour.html b/include/working-with-field-recorders-in-ardour.html
new file mode 100644 (file)
index 0000000..eab4310
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Working with Field Recorders in Ardour
+---
+
+
diff --git a/include/working-with-synchronization.html b/include/working-with-synchronization.html
new file mode 100644 (file)
index 0000000..0d03499
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Working with Synchronization
+---
+
+
diff --git a/include/working-with-video-in-ardour.html b/include/working-with-video-in-ardour.html
new file mode 100644 (file)
index 0000000..4d3ccd9
--- /dev/null
@@ -0,0 +1,5 @@
+---
+title: Working with Video in Ardour
+---
+
+
diff --git a/master-doc.txt b/master-doc.txt
new file mode 100644 (file)
index 0000000..d263e68
--- /dev/null
@@ -0,0 +1,1932 @@
+<!-- exploded -->
+
+---
+title: Introduction to Ardour
+part: part
+---
+
+
+---
+title: Welcome to Ardour
+include: welcome-to-ardour.html
+part: chapter
+---
+
+---
+title: About Ardour's documentation
+include: _manual/01_welcome-to-ardour/02_about-ardour-documentation.html
+link: about-ardour-doc
+part: subchapter
+---
+
+---
+title: Welcome to Ardour!
+include: _manual/01_welcome-to-ardour.html
+part: subchapter
+---
+
+---
+title: Isn't This A Really Complicated Program?
+include: _manual/01_welcome-to-ardour/01_about-ardour/01_isnt-this-a-really-complicated-program.html
+part: subchapter
+---
+
+---
+title: Why Write a DAW for Linux?
+include: _manual/01_welcome-to-ardour/01_about-ardour/02_why-write-a-daw-for-linux.html
+part: subchapter
+---
+
+---
+title: Why is it called Ardour?
+include: _manual/01_welcome-to-ardour/01_about-ardour/03_why-is-it-called-ardour.html
+part: subchapter
+---
+
+---
+title: Why write another DAW?
+include: _manual/01_welcome-to-ardour/01_about-ardour/04_why-write-another-daw.html
+part: subchapter
+---
+
+---
+title: Additional Resources
+include: _manual/01_welcome-to-ardour/03_additional-resources.html
+part: subchapter
+---
+
+---
+title: Creating Music with Ardour
+include: _manual/02_introducing-ardour/01_creating-music-with-ardour.html
+part: subchapter
+---
+
+---
+title: Ardour Concepts
+include: ardour-concepts.html
+part: chapter
+---
+
+---
+title: Understanding Basic Concepts and Terminology
+include: _manual/02_introducing-ardour/02_understanding-basic-concepts-and-terminology.html
+part: subchapter
+---
+
+---
+title: Basic GUI Operations
+include: _manual/02_introducing-ardour/03_basic-gui-operations.html
+part: subchapter
+---
+
+---
+title: Interface Elements
+include: _manual/02_introducing-ardour/03_basic-gui-operations/01_interface-elements.html
+part: subchapter
+---
+
+---
+title: Selection Techniques
+include: _manual/02_introducing-ardour/03_basic-gui-operations/02_selection-techniques.html
+part: subchapter
+---
+
+---
+title: Tooltips
+include: _manual/02_introducing-ardour/03_basic-gui-operations/03_tooltips.html
+part: subchapter
+---
+
+---
+title: Undo/Redo for Editing
+include: _manual/02_introducing-ardour/03_basic-gui-operations/04_undoredo-for-editing-.html
+part: subchapter
+---
+
+---
+title: Using the Mouse
+include: _manual/02_introducing-ardour/03_basic-gui-operations/05_using-the-mouse.html
+part: subchapter
+---
+
+---
+title: Cut and Paste Operations
+include: _manual/02_introducing-ardour/03_basic-gui-operations/06_cut-and-paste-operations.html
+part: subchapter
+---
+
+---
+title: Deleting Objects
+include: _manual/02_introducing-ardour/03_basic-gui-operations/07_deleting-objects.html
+part: subchapter
+---
+
+---
+title: Starting Ardour
+include: _manual/03_setting-up-your-system/08_starting-ardour.html
+part: subchapter
+---
+
+---
+title: Keyboard and Mouse Shortcuts
+include: keyboard-and-mouse-shortcuts.html
+part: chapter
+---
+
+---
+title: Default Keyboard Bindings
+menu_title: Key Bindings
+include: _manual/23_default-keyboard-bindings.html
+part: subchapter
+---
+
+---
+title: Mnemonic Bindings for Linux
+menu_title: Linux
+include: _manual/23_default-keyboard-bindings/01_mnemonic-bindings-for-linux.html
+part: subchapter
+---
+
+---
+title: Mnemonic Bindings for OS X
+include: _manual/23_default-keyboard-bindings/02_mnemonic-bindings-for-os-x.html
+part: subchapter
+---
+
+
+---
+title: Ardour Configuration
+part: part
+---
+
+
+---
+title: Ardour Systems
+include: ardour-systems.html
+part: chapter
+---
+
+---
+title: The Right Computer System for Digital Audio
+menu_title: The Right Computer System
+include: _manual/03_setting-up-your-system/01_the-right-computer-system-for-digital-audio.html
+part: subchapter
+---
+
+---
+title: Mouse
+include: _manual/03_setting-up-your-system/02_mouse.html
+part: subchapter
+---
+
+---
+title: System Setup
+include: system-setup.html
+part: chapter
+---
+
+---
+title: Setting Up Your System
+include: _manual/03_setting-up-your-system.html
+part: subchapter
+---
+
+---
+title: Platform Specifics
+include: _manual/03_setting-up-your-system/07_platform-specifics.html
+part: subchapter
+---
+
+---
+title: Ubuntu Linux
+include: _manual/03_setting-up-your-system/07_platform-specifics/01_ubuntu-linux.html
+part: subchapter
+---
+
+---
+title: Microsoft Windows
+include: _manual/03_setting-up-your-system/07_platform-specifics/02_microsoft-windows.html
+part: subchapter
+---
+
+---
+title: KDE Plasma 5
+include: kde-plasma-5.html
+part: subchapter
+---
+
+---
+title: I/O Setup
+include: i_o-setup.html
+part: chapter
+---
+
+---
+title: Connecting Audio and MIDI Devices
+include: _manual/03_setting-up-your-system/04_connecting-audio-and-midi-devices.html
+part: subchapter
+---
+
+---
+title: Using More Than One Audio Device
+include: _manual/03_setting-up-your-system/06_using_more_than_one_audio_device.html
+part: subchapter
+---
+
+---
+title: Preferences
+include: preferences.html
+part: chapter
+---
+
+---
+title: Preferences and Session Properties
+include: _manual/24_preferences-and-session-properties.html
+part: subchapter
+---
+
+---
+title: Global Preferences Dialog
+menu_title: Global Preferences
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog.html
+part: subchapter
+---
+
+---
+title: Global Misc Tab
+menu_title: Misc Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/01_misc.html
+part: subchapter
+---
+
+---
+title: Transport Tab
+menu_title: Transport Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/02_transport.html
+part: subchapter
+---
+
+---
+title: Editor Tab
+menu_title: Editor Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/03_editor.html
+part: subchapter
+---
+
+---
+title: Audio Tab
+menu_title: Audio Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/04_audio.html
+part: subchapter
+---
+
+---
+title: Solo/Mute Tab
+menu_title: Solo/Mute Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/05_solomute.html
+part: subchapter
+---
+
+---
+title: MIDI Tab
+menu_title: MIDI Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/06_midi.html
+part: subchapter
+---
+
+---
+title: User Interaction Tab
+menu_title: User Interaction Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/07_interaction.html
+part: subchapter
+---
+
+---
+title: Control Surfaces Tab
+menu_title: Control Surfaces Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/08_control_surfaces.html
+part: subchapter
+---
+
+---
+title: Video Tab
+menu_title: Video Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/09_video.html
+part: subchapter
+---
+
+---
+title: Plugins Tab
+menu_title: Plugins Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/10_plugins.html
+part: subchapter
+---
+
+---
+title: GUI Tab
+menu_title: GUI Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/11_gui.html
+part: subchapter
+---
+
+---
+title: Metering Tab
+menu_title: Metering Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/12_metering.html
+part: subchapter
+---
+
+---
+title: Theme Tab
+menu_title: Theme Tab
+include: _manual/24_preferences-and-session-properties/01_preferences-dialog/13_theme.html
+part: subchapter
+---
+
+---
+title: Session Properties Dialog
+menu_title: Session Properties
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog.html
+part: subchapter
+---
+
+---
+title: Timecode Tab
+menu_title: Timecode Tab
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog/01_timecode.html
+part: subchapter
+---
+
+---
+title: Sync Tab
+menu_title: Sync Tab
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog/02_sync.html
+part: subchapter
+---
+
+---
+title: Fades Tab
+menu_title: Fades Tab
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog/03_fades.html
+part: subchapter
+---
+
+---
+title: Media Tab
+menu_title: Media Tab
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog/04_media.html
+part: subchapter
+---
+
+---
+title: Locations Tab
+menu_title: Locations Tab
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog/05_locations.html
+part: subchapter
+---
+
+---
+title: Filenames Tab
+menu_title: Filenames Tab
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog/06_filenames.html
+part: subchapter
+---
+
+---
+title: Monitoring Tab
+menu_title: Monitoring Tab
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog/07_monitoring.html
+part: subchapter
+---
+
+---
+title: Meterbridge Tab
+menu_title: Meterbridge Tab
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog/08_meterbridge.html
+part: subchapter
+---
+
+---
+title: Session Misc Tab
+menu_title: Misc Tab
+include: _manual/24_preferences-and-session-properties/02_session-properties-dialog/09_misc.html
+part: subchapter
+---
+
+---
+title: Configuring MIDI
+include: configuring-midi.html
+part: chapter
+---
+
+---
+title: Using External MIDI Devices
+include: _manual/03_setting-up-your-system/03_using-external-midi-devices.html
+part: subchapter
+---
+
+---
+title: Setting Up MIDI
+include: _manual/03_setting-up-your-system/05_setting-up-midi.html
+part: subchapter
+---
+
+---
+title: MIDI on Linux
+include: _manual/03_setting-up-your-system/05_setting-up-midi/02_midi-on-linux.html
+part: subchapter
+---
+
+---
+title: MIDI on OS X
+include: _manual/03_setting-up-your-system/05_setting-up-midi/01_midi-on-os-x.html
+part: subchapter
+---
+
+
+---
+title: Ardour's Interface
+part: part
+---
+
+
+---
+title: About Ardour's Interface
+include: _manual/05_ardours-interface.html
+part: chapter
+---
+
+---
+title: Main Menu
+include: _manual/05_ardours-interface/01_main-menu.html
+part: chapter
+---
+
+---
+title: The Session Menu
+include: _manual/05_ardours-interface/01_main-menu/01_Session-menu.html
+part: subchapter
+---
+
+---
+title: The Transport Menu
+include: _manual/05_ardours-interface/01_main-menu/02_Transport-menu.html
+part: subchapter
+---
+
+---
+title: The Edit Menu
+include: _manual/05_ardours-interface/01_main-menu/03_Edit-menu.html
+part: subchapter
+---
+
+---
+title: The Region Menu
+include: _manual/05_ardours-interface/01_main-menu/04_Region-menu.html
+part: subchapter
+---
+
+---
+title: The Track Menu
+include: _manual/05_ardours-interface/01_main-menu/05_Track-menu.html
+part: subchapter
+---
+
+---
+title: The View Menu
+include: _manual/05_ardours-interface/01_main-menu/06_View-menu.html
+part: subchapter
+---
+
+---
+title: The Window Menu
+include: _manual/05_ardours-interface/01_main-menu/07_Window-menu.html
+part: subchapter
+---
+
+---
+title: The Help Menu
+include: _manual/05_ardours-interface/01_main-menu/08_Help-menu.html
+part: subchapter
+---
+
+---
+title: Status Bar
+include: _manual/05_ardours-interface/02_status-bar.html
+part: chapter
+---
+
+---
+title: Transport Bar
+include: _manual/05_ardours-interface/03_the-transport-bar.html
+part: chapter
+---
+
+---
+title: Clocks
+include: clocks.html
+part: chapter
+---
+
+---
+title: Transport Clocks
+include: _manual/05_ardours-interface/04_transport-clocks.html
+part: subchapter
+---
+
+---
+title: Selection and Punch Clocks
+include: _manual/05_ardours-interface/05_selection-and-punch-clocks.html
+part: subchapter
+---
+
+---
+title: Status Indicators and Mode Buttons
+include: _manual/05_ardours-interface/06_status-indicators.html
+part: chapter
+---
+
+---
+title: Toolbox
+include: _manual/05_ardours-interface/07_the-toolbox.html
+part: chapter
+---
+
+---
+title: Controls
+include: controls.html
+part: chapter
+---
+
+---
+title: Zoom Controls
+include: _manual/05_ardours-interface/08_the-zoom-controls.html
+part: subchapter
+---
+
+---
+title: Grid Controls
+include: _manual/05_ardours-interface/09_the-grid-controls.html
+part: subchapter
+---
+
+---
+title: Edit Point Control
+include: _manual/05_ardours-interface/10_the-edit-point-control.html
+part: subchapter
+---
+
+---
+title: Nudge Controls
+include: _manual/05_ardours-interface/11_the-nudge-controls.html
+part: subchapter
+---
+
+---
+title: Ruler
+include: _manual/05_ardours-interface/12_the-ruler.html
+part: chapter
+---
+
+---
+title: Summary
+include: _manual/05_ardours-interface/13_the-summary.html
+part: chapter
+---
+
+---
+title: Editor Lists
+include: _manual/05_ardours-interface/14_editor-lists.html
+part: chapter
+---
+
+---
+title: The Region List
+include: _manual/05_ardours-interface/14_editor-lists/01_region-list.html
+part: subchapter
+---
+
+---
+title: The Tracks and Busses List
+include: _manual/05_ardours-interface/14_editor-lists/02_tracks-and-busses-list.html
+part: subchapter
+---
+
+---
+title: The Snapshot List
+include: _manual/05_ardours-interface/14_editor-lists/03_snapshot-list.html
+part: subchapter
+---
+
+---
+title: The Track and Bus Group List
+include: _manual/05_ardours-interface/14_editor-lists/04_track-and-bus-group-list.html
+part: subchapter
+---
+
+---
+title: The Ranges and Marks Lists
+include: _manual/05_ardours-interface/14_editor-lists/05_ranges-and-marks-list.html
+part: subchapter
+---
+
+---
+title: Favorite Plugins Window
+include: _manual/05_ardours-interface/15_favorite-plugins-window.html
+part: chapter
+---
+
+---
+title: Strips list
+include: _manual/05_ardours-interface/16_the-strips-list.html
+part: chapter
+---
+
+---
+title: Groups list
+include: _manual/05_ardours-interface/17_the-groups-list.html
+part: chapter
+---
+
+---
+title: Mixer Strips
+include: mixer-strips.html
+part: chapter
+---
+
+---
+title: Audio/MIDI Mixer Strips
+include: _manual/05_ardours-interface/18_audio-midi-mixer-strips.html
+part: subchapter
+---
+
+---
+title: Audio/MIDI Busses Mixer Strips
+include: _manual/05_ardours-interface/19_busses-mixer-strips.html
+part: subchapter
+---
+
+---
+title: Control Masters Mixer Strips
+include: _manual/05_ardours-interface/20_control-masters.html
+part: subchapter
+---
+
+---
+title: Master Bus Strip
+include: _manual/05_ardours-interface/21_the-master-bus-strip.html
+part: subchapter
+---
+
+---
+title: Monitor Section
+include: _manual/05_ardours-interface/22_the-monitor-section.html
+part: chapter
+---
+
+
+---
+title: Sessions & Tracks
+part: part
+---
+
+
+---
+title: Sessions
+include: sessions.html
+part: chapter
+---
+
+---
+title: New/Open Session Dialog
+include: _manual/08_working-with-sessions/01_new-session-dialog.html
+part: subchapter
+---
+
+---
+title: What's in a Session?
+include: _manual/08_working-with-sessions/02_whats-in-a-session.html
+part: subchapter
+---
+
+---
+title: Where Are Sessions Stored?
+include: _manual/08_working-with-sessions/03_where-are-sessions-stored.html
+part: subchapter
+---
+
+---
+title: Backup and Sharing of Sessions
+include: _manual/08_working-with-sessions/04_backup-and-sharing-of-sessions.html
+part: subchapter
+---
+
+---
+title: Interchange with other DAWs
+include: _manual/08_working-with-sessions/05_interchange-with-other-daws.html
+part: subchapter
+---
+
+---
+title: Copying The Interchange Folder
+include: _manual/08_working-with-sessions/05_interchange-with-other-daws/01_copying-the-interchange-folder.html
+part: subchapter
+---
+
+---
+title: Stem Exports
+include: _manual/08_working-with-sessions/05_interchange-with-other-daws/02_stem-exports.html
+part: subchapter
+---
+
+---
+title: Using AATranslator
+include: _manual/08_working-with-sessions/05_interchange-with-other-daws/03_using-aatranslator.html
+part: subchapter
+---
+
+---
+title: Renaming a Session
+include: _manual/08_working-with-sessions/06_renaming-a-session.html
+part: subchapter
+---
+
+---
+title: Session Templates
+include: _manual/08_working-with-sessions/07_session-templates.html
+part: subchapter
+---
+
+---
+title: Snapshots
+include: _manual/08_working-with-sessions/08_snapshots.html
+part: subchapter
+---
+
+---
+title: Metadata
+include: _manual/08_working-with-sessions/09_metadata.html
+part: subchapter
+---
+
+---
+title: Cleaning up Sessions
+include: _manual/08_working-with-sessions/10_cleaning_up.html
+part: subchapter
+---
+
+---
+title: Copying versus Linking
+include: _manual/15_adding-pre-existing-material/02_copying-versus-linking.html
+part: subchapter
+---
+
+---
+title: Adding Pre-existing Material
+include: _manual/15_adding-pre-existing-material.html
+part: subchapter
+---
+
+---
+title: Import Dialog
+include: _manual/15_adding-pre-existing-material/01_import-dialog.html
+part: subchapter
+---
+
+---
+title: Searching for Files Using Tags
+include: _manual/15_adding-pre-existing-material/03_searching-for-files-using-tags.html
+part: subchapter
+---
+
+---
+title: Supported File Formats
+include: _manual/15_adding-pre-existing-material/04_supported-file-formats.html
+part: subchapter
+---
+
+---
+title: Tracks
+include: tracks.html
+part: chapter
+---
+
+---
+title: Track Types
+include: _manual/11_working-with-tracks/01_track-types.html
+part: subchapter
+---
+
+---
+title: Adding Tracks, Busses and VCAs
+include: _manual/11_working-with-tracks/02_adding-tracks-and-busses.html
+part: subchapter
+---
+
+---
+title: Selecting Tracks
+include: _manual/11_working-with-tracks/03_selecting-tracks.html
+part: subchapter
+---
+
+---
+title: Controlling Track Appearance
+include: _manual/11_working-with-tracks/04_controlling-track-appearance.html
+part: subchapter
+---
+
+---
+title: Layering Display
+include: _manual/11_working-with-tracks/04_controlling-track-appearance/01_layering-display.html
+part: subchapter
+---
+
+---
+title: Track Color
+include: _manual/11_working-with-tracks/04_controlling-track-appearance/02_track-coloring.html
+part: subchapter
+---
+
+---
+title: Track Height
+include: _manual/11_working-with-tracks/04_controlling-track-appearance/03_track-height.html
+part: subchapter
+---
+
+---
+title: Waveform display
+include: _manual/11_working-with-tracks/04_controlling-track-appearance/04_waveform-display.html
+part: subchapter
+---
+
+---
+title: Controlling Track Ordering
+include: _manual/11_working-with-tracks/05_controlling-track-ordering.html
+part: subchapter
+---
+
+---
+title: Reordering Tracks
+include: _manual/11_working-with-tracks/05_controlling-track-ordering/01_reordering-tracks.html
+part: subchapter
+---
+
+---
+title: Track Ordering and Remote Control IDs
+include: _manual/11_working-with-tracks/05_controlling-track-ordering/02_track-ordering-and-remote-control-ids.html
+part: subchapter
+---
+
+---
+title: Bus Controls
+include: _manual/11_working-with-tracks/06_bus-controls.html
+part: subchapter
+---
+
+---
+title: Audio Track Controls
+include: _manual/11_working-with-tracks/07_audio-track-controls.html
+part: subchapter
+---
+
+---
+title: MIDI Track Controls
+include: _manual/11_working-with-tracks/08_midi-track-controls.html
+part: subchapter
+---
+
+---
+title: Track Context Menu
+include: _manual/11_working-with-tracks/10_track-context-menu.html
+part: subchapter
+---
+
+---
+title: Grouping Tracks
+include: grouping-tracks.html
+part: chapter
+---
+
+---
+title: Track and Bus Groups
+include: _manual/11_working-with-tracks/09_track-and-bus-groups.html
+part: subchapter
+---
+
+---
+title: Importing and Exporting Session Data
+include: importing-and-exporting-session-data.html
+part: chapter
+---
+
+---
+title: File and Session Management and Compatibility
+include: file-and-session-management-and-compatibility.html
+part: chapter
+---
+
+
+---
+title: Playback & Recording
+part: part
+---
+
+
+---
+title: Playing Back Track Material
+include: playing-back-track-material.html
+part: chapter
+---
+
+---
+title: Controlling Playback
+include: _manual/06_controlling-playback.html
+part: subchapter
+---
+
+---
+title: Using Key Bindings
+include: using-key-bindings.html
+part: subchapter
+---
+
+---
+title: Record Setup
+include: record-setup.html
+part: chapter
+---
+
+---
+title: Track Recording Modes
+include: _manual/16_recording/02_track-recording-modes.html
+part: subchapter
+---
+
+---
+title: Audio Recording
+include: audio-recording.html
+part: chapter
+---
+
+---
+title: Monitoring
+include: _manual/16_recording/01_monitoring.html
+part: subchapter
+---
+
+---
+title: Latency Considerations
+menu_title: Latency
+include: _manual/16_recording/01_monitoring/01_latency-considerations.html
+part: subchapter
+---
+
+---
+title: Monitor Signal Flow
+menu_title: Signal Flow
+include: _manual/16_recording/01_monitoring/02_monitor-signal-flow.html
+part: subchapter
+---
+
+---
+title: Monitor Setup in Ardour
+menu_title: Setup in Ardour
+include: _manual/16_recording/01_monitoring/03_monitor-setup-in-ardour.html
+part: subchapter
+---
+
+---
+title: MIDI Recording
+include: midi-recording.html
+part: chapter
+---
+
+---
+title: Punch Recording Modes
+include: punch-recording-modes.html
+part: chapter
+---
+
+---
+title: Working With Markers
+include: _manual/07_working-with-markers.html
+part: subchapter
+---
+
+---
+title: Creating Location Markers
+include: _manual/07_working-with-markers/01_creating-location-markers.html
+part: subchapter
+---
+
+---
+title: Creating Range Markers
+include: _manual/07_working-with-markers/02_creating-range-markers.html
+part: subchapter
+---
+
+---
+title: Moving Markers
+include: _manual/07_working-with-markers/03_moving-markers.html
+part: subchapter
+---
+
+---
+title: The Loop Range
+include: _manual/07_working-with-markers/04_loop-range.html
+part: subchapter
+---
+
+---
+title: Marker Context Menu
+include: _manual/07_working-with-markers/05_marker-context-menu.html
+part: subchapter
+---
+
+---
+title: Punch Range
+include: _manual/07_working-with-markers/06_punch-range.html
+part: subchapter
+---
+
+
+---
+title: Editing
+part: part
+---
+
+
+---
+title: Editing Basics
+include: editing-basics.html
+part: chapter
+---
+
+---
+title: Working With Regions
+include: _manual/09_working-with-regions.html
+part: subchapter
+---
+
+---
+title: Region Naming
+include: _manual/09_working-with-regions/01_region-naming.html
+part: subchapter
+---
+
+---
+title: Corresponding Regions Selection
+include: _manual/09_working-with-regions/02_corresponding-regions-selection.html
+part: subchapter
+---
+
+---
+title: Region Context Menu
+include: _manual/09_working-with-regions/03_region-context-menu.html
+part: subchapter
+---
+
+---
+title: Common Region Edit Operations
+menu_title: Region Editing
+include: _manual/18_editing-and-arranging/03_common-region-edit-operations.html
+part: subchapter
+---
+
+---
+title: Copy Regions
+include: _manual/18_editing-and-arranging/05_copy-regions.html
+part: subchapter
+---
+
+---
+title: Move Regions
+include: _manual/18_editing-and-arranging/06_move-regions.html
+part: subchapter
+---
+
+---
+title: Move Regions With the Mouse
+include: _manual/18_editing-and-arranging/06_move-regions/01_move-regions-with-the-mouse.html
+part: subchapter
+---
+
+---
+title: Align (Spot) Regions
+include: _manual/18_editing-and-arranging/06_move-regions/02_align-spotting-regions.html
+part: subchapter
+---
+
+---
+title: Edit Mode and Tools
+include: edit-mode-and-tools.html
+part: chapter
+---
+
+---
+title: Editing Clocks
+include: _manual/02_introducing-ardour/03_basic-gui-operations/08_editing-clocks.html
+part: subchapter
+---
+
+---
+title: Which Regions Are Affected?
+menu_title: Affected Regions
+include: _manual/18_editing-and-arranging/02_which-regions-are-affected.html
+part: subchapter
+---
+
+---
+title: Making Selections
+include: making-selections.html
+part: chapter
+---
+
+---
+title: Select Regions
+include: _manual/18_editing-and-arranging/01_select-regions.html
+part: subchapter
+---
+
+---
+title: Editing Regions and Selections
+include: editing-regions-and-selections.html
+part: chapter
+---
+
+---
+title: Trimming Regions
+include: _manual/18_editing-and-arranging/04_change-region-lengths.html
+part: subchapter
+---
+
+---
+title: Push/Pull Trimming
+include: _manual/18_editing-and-arranging/04_change-region-lengths/01_pushpull-trimming.html
+part: subchapter
+---
+
+---
+title: Separate Under
+include: _manual/18_editing-and-arranging/08_separation/01_separate-under.html
+part: subchapter
+---
+
+---
+title: Separate Range
+include: _manual/18_editing-and-arranging/08_separation/02_separate-range.html
+part: subchapter
+---
+
+---
+title: Strip Silence from Audio Regions
+menu_title: Stripping Silence
+include: _manual/18_editing-and-arranging/09_strip-silence-from-audio-regions.html
+part: subchapter
+---
+
+---
+title: Fades and Crossfades
+include: fades-and-crossfades.html
+part: chapter
+---
+
+---
+title: Create Region Fades and Crossfades
+include: _manual/18_editing-and-arranging/07_create-region-fades-and-crossfades.html
+part: subchapter
+---
+
+---
+title: Playlists
+include: playlists.html
+part: chapter
+---
+
+---
+title: Understanding Playlists
+include: _manual/10_working-with-playlists/01_understanding-playlists.html
+part: subchapter
+---
+
+---
+title: Playlist Operations
+include: _manual/10_working-with-playlists/02_playlist-operations.html
+part: subchapter
+---
+
+---
+title: Playlist Usecases
+include: _manual/10_working-with-playlists/03_playlist_usecases.html
+part: subchapter
+---
+
+---
+title: Rhythm Ferret
+include: rhythm-ferret.html
+part: chapter
+---
+
+
+---
+title: MIDI
+part: part
+---
+
+
+---
+title: MIDI Editing
+include: midi-editing.html
+part: chapter
+---
+
+---
+title: Edit MIDI
+include: _manual/12_working-with-midi.html
+part: subchapter
+---
+
+---
+title: Fundamental Concepts
+include: _manual/12_working-with-midi/01_fundamental-concepts.html
+part: subchapter
+---
+
+---
+title: Create MIDI Tracks
+include: _manual/12_working-with-midi/02_create-midi-tracks.html
+part: subchapter
+---
+
+---
+title: Create MIDI Regions
+include: _manual/12_working-with-midi/03_create-midi-regions.html
+part: subchapter
+---
+
+---
+title: Add New Notes
+include: _manual/12_working-with-midi/04_add-new-notes.html
+part: subchapter
+---
+
+---
+title: Change Note Properties
+include: _manual/12_working-with-midi/05_change-note-properties.html
+part: subchapter
+---
+
+---
+title: Handling Overlapping Notes
+menu_title: Overlapping Notes
+include: _manual/12_working-with-midi/06_handle-overlapping-notes.html
+part: subchapter
+---
+
+---
+title: Note Cut, Copy and Paste
+include: _manual/12_working-with-midi/07_note-cut-copy-and-paste-.html
+part: subchapter
+---
+
+---
+title: Note Selection
+include: _manual/12_working-with-midi/08_note-selection.html
+part: subchapter
+---
+
+---
+title: Quantize MIDI
+include: _manual/12_working-with-midi/09_quantize-midi.html
+part: subchapter
+---
+
+---
+title: Step Entry
+include: _manual/12_working-with-midi/10_step-entry.html
+part: subchapter
+---
+
+---
+title: Patch Change
+include: _manual/12_working-with-midi/11_patch-change.html
+part: subchapter
+---
+
+---
+title: Independent and Dependent MIDI Region Copies
+menu_title: Copy MIDI Region
+include: _manual/12_working-with-midi/12_copy-midi-region.html
+part: subchapter
+---
+
+---
+title: Transposing MIDI
+include: _manual/12_working-with-midi/13_transpose-midi.html
+part: subchapter
+---
+
+---
+title: Automating MIDI - Pitch bending and aftertouch
+menu_title: Automating MIDI
+include: _manual/12_working-with-midi/14_automation-midi.html
+part: subchapter
+---
+
+---
+title: Transforming MIDI - Mathematical operations
+menu_title: Transforming MIDI
+include: _manual/12_working-with-midi/15_transformation-midi.html
+part: subchapter
+---
+
+---
+title: MIDI Editors
+include: midi-editors.html
+part: chapter
+---
+
+---
+title: MIDI Scene Automation
+include: _manual/19_automation/01_midi-scenes.html
+part: subchapter
+---
+
+---
+title: Score Editor
+include: score-editor.html
+part: chapter
+---
+
+---
+title: MIDI Event List
+include: midi-event-list.html
+part: chapter
+---
+
+
+---
+title: Arranging
+part: part
+---
+
+
+---
+title: Time, Tempo and Meter
+include: time_-tempo-and-meter.html
+part: chapter
+---
+
+---
+title: Tempo and Meter
+include: _manual/14_working-with-tempo-and-meter.html
+part: subchapter
+---
+
+---
+title: Techniques for Working with Tempo and Meter
+include: techniques-for-working-with-tempo-and-meter.html
+part: subchapter
+---
+
+---
+title: Memory Locations
+include: memory-locations.html
+part: chapter
+---
+
+---
+title: Arranging Regions
+include: arranging-regions.html
+part: chapter
+---
+
+---
+title: Region Loops and Groups
+include: region-loops-and-groups.html
+part: chapter
+---
+
+
+---
+title: Mixing
+part: part
+---
+
+
+---
+title: Basic Mixing
+include: basic-mixing.html
+part: chapter
+---
+
+---
+title: Metering in Ardour
+include: _manual/04_meters.html
+part: subchapter
+---
+
+---
+title: Signal Routing
+include: _manual/17_signal-routing.html
+part: subchapter
+---
+
+---
+title: Aux Sends
+include: _manual/17_signal-routing/01_aux-sends.html
+part: subchapter
+---
+
+---
+title: Comparing Aux Sends and Subgroups
+menu_title: Auxes vs. Groups
+include: _manual/17_signal-routing/02_comparing-aux-sends-and-subgroups.html
+part: subchapter
+---
+
+---
+title: External Sends
+include: _manual/17_signal-routing/03_external-sends.html
+part: subchapter
+---
+
+---
+title: Inserts
+include: _manual/17_signal-routing/04_inserts.html
+part: subchapter
+---
+
+---
+title: Subgrouping
+include: _manual/17_signal-routing/06_subgrouping.html
+part: subchapter
+---
+
+---
+title: Patchbay
+include: _manual/17_signal-routing/07_Patchbay.html
+part: subchapter
+---
+
+---
+title: Track/Bus Signal Flow
+include: _manual/17_signal-routing/08_signal-flow.html
+part: subchapter
+---
+
+---
+title: Sidechaining
+include: _manual/17_signal-routing/09_sidechaining.html
+part: subchapter
+---
+
+---
+title: Muting and Soloing
+include: _manual/20_mixing/01_muting-and-soloing.html
+part: subchapter
+---
+
+---
+title: Panning
+include: _manual/20_mixing/02_panning.html
+part: subchapter
+---
+
+---
+title: Mono Panner
+include: _manual/20_mixing/02_panning/01_mono_panner.html
+part: subchapter
+---
+
+---
+title: Balance Control
+include: _manual/20_mixing/02_panning/02_balance_control.html
+part: subchapter
+---
+
+---
+title: Stereo Panner
+include: _manual/20_mixing/02_panning/03_stereo_panner.html
+part: subchapter
+---
+
+---
+title: Plugin and Hardware Inserts
+include: plugin-and-hardware-inserts.html
+part: chapter
+---
+
+---
+title: Working With Plugins
+include: _manual/13_working-with-plugins.html
+part: subchapter
+---
+
+---
+title: Processor Box
+link: processor-box
+include: _manual/13_working-with-plugins/03_processor-box.html
+part: subchapter
+---
+
+---
+title: Plugin Manager
+link: plugin-manager
+include: _manual/13_working-with-plugins/02_plugin-manager.html
+part: subchapter
+---
+
+---
+title: Favorite Plugins Window
+include: favorite-plugins-window.html
+part: subchapter
+---
+
+---
+title: Managing Plugin Presets
+include: _manual/13_working-with-plugins/01_managing-plugin-presets.html
+part: subchapter
+---
+
+---
+title: Working with Ardour-built Plugin Editors
+include: _manual/13_working-with-plugins/06_working-with-ardour-built-plugin-editors.html
+part: subchapter
+---
+
+---
+title: Plugins Bundled With Ardour
+include: plugins-bundled-with-ardour.html
+part: subchapter
+---
+
+---
+title: Getting More Plugins
+include: _manual/13_working-with-plugins/07_getting-plugins.html
+part: subchapter
+---
+
+---
+title: Using Windows VST Plugins on Linux
+include: _manual/13_working-with-plugins/05_windows-vst-support.html
+part: subchapter
+---
+
+---
+title: Automation
+include: automation.html
+part: chapter
+---
+
+---
+title: Mixdown
+include: mixdown.html
+part: chapter
+---
+
+---
+title: Export Dialog
+include: _manual/21_exporting/01_export-dialog.html
+part: subchapter
+---
+
+---
+title: Export Format Profiles
+include: _manual/21_exporting/02_edit-export-format-profile.html
+part: subchapter
+---
+
+
+---
+title: Surround
+part: part
+---
+
+
+---
+title: Ardour Setup for Surround
+include: ardour-setup-for-surround.html
+part: chapter
+---
+
+---
+title: Multichannel Tracks and Signal Routing
+include: multichannel-tracks-and-signal-routing.html
+part: chapter
+---
+
+---
+title: Surround Panning and Mixing
+include: surround-panning-and-mixing.html
+part: chapter
+---
+
+---
+title: VBAP Panner
+include: _manual/20_mixing/02_panning/04_vbap_panner.html
+part: subchapter
+---
+
+
+---
+title: Sync & Video
+part: part
+---
+
+
+---
+title: Working with Synchronization
+include: working-with-synchronization.html
+part: chapter
+---
+
+---
+title: On Clock and Time
+include: _manual/22_synchronization/01_on-clock-and-time.html
+part: subchapter
+---
+
+---
+title: Latency and Latency-Compensation
+menu_title: Latency
+include: _manual/22_synchronization/02_latency-and-latency-compensation.html
+part: subchapter
+---
+
+---
+title: Timecode Generators and Slaves
+include: _manual/22_synchronization/03_timecode-generators-and-slaves.html
+part: subchapter
+---
+
+---
+title: Overview of all Timecode related settings
+menu_title: Overview of Timecode settings
+include: _manual/22_synchronization/04_overview-of-timecode-related-settings.html
+part: subchapter
+---
+
+---
+title: Working with Field Recorders in Ardour
+include: working-with-field-recorders-in-ardour.html
+part: chapter
+---
+
+---
+title: Working with Video in Ardour
+include: working-with-video-in-ardour.html
+part: chapter
+---
+
+---
+title: Video Timeline and Monitoring
+include: _manual/26_video-timeline.html
+part: subchapter
+---
+
+---
+title: Video Timeline Setup
+include: _manual/26_video-timeline/01_setup.html
+part: subchapter
+---
+
+---
+title: Transcoding, Formats &amp; Codecs
+include: _manual/26_video-timeline/02_transcoding_formats_codecs.html
+part: subchapter
+---
+
+---
+title: Workflow &amp; Operations
+include: _manual/26_video-timeline/03_operations.html
+part: subchapter
+---
+
+
+---
+title: Control Surfaces
+part: part
+---
+
+
+---
+title: Controlling Ardour with OSC
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc.html
+exclude: yes
+part: chapter
+---
+
+---
+title: OSC&#58; Controlling Ardour with OSC
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc/01_osc-control.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: OSC&#58; Using the Setup Dialog
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc/02_osc-setup-dialog.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: OSC&#58; Querying Ardour
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc/03_querying-ardour-with-osc.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: OSC&#58; Feedback
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc/04_feedback-in-osc.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: OSC&#58; Feedback and Strip-types Values
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc/05_calculating-feedback-and-strip-types-values.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: OSC&#58; Personal Monitoring Control
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc/06_osc-personal-monitoring.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: OSC&#58; Parameter Types
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc/07_parameter-types-in-osc.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: OSC&#58; Selection and Expansion Considerations
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc/08_selection-considerations-in-osc.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: OSC control for Ardour 4.7 and Prior
+include: _manual/25_using-control-surfaces/01_controlling-ardour-with-osc/09_osc-control-in-ardour-4.7-and-prior.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: Controlling Ardour with Mackie Control Devices
+include: _manual/25_using-control-surfaces/02_mackie-control-protocol.html
+exclude: yes
+part: chapter
+---
+
+---
+title: Devices Using Mackie/Logic Control Protocol
+include: _manual/25_using-control-surfaces/02_mackie-control-protocol/01_mackie-control-configure.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: SSL Nucleus
+include: _manual/25_using-control-surfaces/02_mackie-control-protocol/02_ssl-nucleus.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: Behringer Devices in Mackie/Logic Control Mode
+menu_title: Behringer Devices
+include: _manual/25_using-control-surfaces/02_mackie-control-protocol/03_behringer-devices-in-mackielogic-control-mode.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: What to do if your Device is not Listed
+menu_title: Unlisted Devices
+include: _manual/25_using-control-surfaces/02_mackie-control-protocol/04_devices-not-listed.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: Working With Extenders
+menu_title: Working With Extenders
+include: _manual/25_using-control-surfaces/02_mackie-control-protocol/05_working-with-extenders.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: Generic MIDI
+include: _manual/25_using-control-surfaces/03_generic-midi.html
+part: chapter
+---
+
+---
+title: Generic MIDI Binding Maps
+include: _manual/25_using-control-surfaces/03_generic-midi/01_midi-binding-maps.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: Generic MIDI Learn
+include: _manual/25_using-control-surfaces/03_generic-midi/02_midi-learn.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: Generic MIDI and Encoders
+menu_title: Working With Encoders
+include: _manual/25_using-control-surfaces/03_generic-midi/03_working-with-encoders.html
+exclude: yes
+part: subchapter
+---
+
+---
+title: Using the Presonus Faderport
+menu_title: Presonus Faderport
+include: _manual/25_using-control-surfaces/04_Presonus_FaderPort.html
+exclude: yes
+part: chapter
+---
+
+---
+title: Using the Ableton Push 2
+menu_title: Ableton Push 2
+include: _manual/25_using-control-surfaces/05_Ableton_Push2.html
+exclude: yes
+part: chapter
+---
+
+
+---
+title: Scripting
+part: part
+---
+
+
+---
+title: Lua Scripting in Ardour
+include: lua-scripting-in-ardour.html
+part: chapter
+---
+
+---
+title: Lua Scripting
+include: _manual/27_lua-scripting.html
+part: subchapter
+---
+
+---
+title: Scripting Documentation
+include: _manual/27_lua-scripting/01_brain_dump.html
+part: subchapter
+---
+
+---
+title: Class Reference
+style: luadoc
+include: _manual/27_lua-scripting/02_class_reference.html
+exclude: yes
+part: subchapter
+---
+
+
+---
+title: Appendix
+part: part
+---
+
+
+---
+title: List of Menu Actions
+include: _manual/28_appendix/01_menu-actions-list.html
+exclude: yes
+part: chapter
+---
+
+---
+title: Ardour Monitor Modes
+include: _manual/28_appendix/02_monitor-modes.html
+exclude: yes
+part: chapter
+---
+
+---
+title: Files and Directories Ardour Knows About
+include: _manual/28_appendix/03_files-and-directories.html
+exclude: yes
+part: chapter
+---
+
diff --git a/page-template.txt b/page-template.txt
new file mode 100644 (file)
index 0000000..2e963dc
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+      
+<head>
+       <title>{{page.page_title}}</title>
+       <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
+
+       <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+       <link href="{{page.bootstrap_path}}/css/bootstrap.min.css" rel="stylesheet" />
+       <link href="{{page.bootstrap_path}}/css/bootstrap-responsive.min.css" rel="stylesheet" />
+
+       <link href="/css/app.css" rel="stylesheet" />
+{% if page.style %}
+       <link href="/css/{{page.style}}.css" rel="stylesheet" />
+{% endif %}
+
+       <link href='http://fonts.googleapis.com/css?family=Junge' rel='stylesheet' type='text/css' />
+</head>
+
+<body>
+<div class="container-fluid"><div class="row-fluid">
+       <div id="tree"><div id="tree-inner">
+               <h1 class="title"><a href="/"><img src="/images/logo.png" alt="The Ardour Manual" /></a></h1>
+{% tree %}
+       </div></div>
+       <div class="span12" id="content">
+               <div id="search" class="gcse-search"></div>
+               <div id="content-main">
+               <h1 class="title">{{ page.title }}</h1>
+{{ content }}
+{% prevnext %}
+               </div>
+       </div>
+</div></div>
+
+<script type="text/javascript">
+// I'll go to hell for this
+var isA = function(regex) { return navigator.userAgent.match(regex) };
+var isAbout = function(regex) { return document.getElementsByTagName('h1')[1].textContent.match(regex) };
+
+if ( (isA(/Mac/) || isAbout(/OS X/)) && (!isAbout(/Linux/)) ) {
+       var e = document.getElementsByTagName('body')[0];
+       e.className += ' mac';  // class magic for Cmd vs. Ctrl keys.
+}
+</script>
+
+<!-- Google search bar == failure  -->
+<script type="text/javascript">
+(function()
+{
+       var cx = '011950134405426689607:2lg2y9xgf3a';
+       var gcse = document.createElement('script'); gcse.type = 'text/javascript';
+       gcse.async = true;
+       gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
+               '//www.google.com/cse/cse.js?cx=' + cx;
+       var s = document.getElementsByTagName('script')[0];
+       s.parentNode.insertBefore(gcse, s);
+})();
+</script>
+
+</body>
+</html>
+
diff --git a/source/images/favorite-plugins.png b/source/images/favorite-plugins.png
new file mode 100644 (file)
index 0000000..0979a8c
Binary files /dev/null and b/source/images/favorite-plugins.png differ
diff --git a/source/images/mixer-to-fav-dnd.png b/source/images/mixer-to-fav-dnd.png
new file mode 100644 (file)
index 0000000..7ef1486
Binary files /dev/null and b/source/images/mixer-to-fav-dnd.png differ
index 2c68f8b7a52d21421eb809f2e70caae56a4afd35..5778a1290be59b05516c9bfce6d9af29feb2377e 100644 (file)
@@ -1,6 +1,6 @@
 <html>
 <head>
-<meta http-equiv="refresh" content="0; url=/welcome-to-ardour/"/>
+<meta http-equiv="refresh" content="0; url=/toc/"/>
 </head>
 <body>
 </body>