diff options
author | Karl Berry <karl@freefriends.org> | 2013-08-26 21:57:03 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-08-26 21:57:03 +0000 |
commit | 288848b5e24e465cc7b0d9687d0309e19f3b8e97 (patch) | |
tree | a2e08417cacb5df27ca59ddccea8a7bdbc2a3cb3 /Master/texmf-dist | |
parent | c492fcca271ba84bff91e6b6237a981061ccc10d (diff) |
guitarchordschemes (26aug13)
git-svn-id: svn://tug.org/texlive/trunk@31524 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r-- | Master/texmf-dist/doc/latex/guitarchordschemes/README | 33 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/guitarchordschemes/guitarchordschemes_en.pdf | bin | 0 -> 116509 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/guitarchordschemes/guitarchordschemes_en.tex | 442 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/guitarchordschemes/guitarchordschemes.sty | 594 |
4 files changed, 1069 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/guitarchordschemes/README b/Master/texmf-dist/doc/latex/guitarchordschemes/README new file mode 100644 index 00000000000..0397df22b11 --- /dev/null +++ b/Master/texmf-dist/doc/latex/guitarchordschemes/README @@ -0,0 +1,33 @@ +-------------------------------------------------------------------------- +the GUITARCHORDSCHEMES package v 0.4 + + Guitar Chord and Scale Tablatures with TikZ + +2013/08/25 +-------------------------------------------------------------------------- +Clemens Niederberger +Web: https://bitbucket.org/cgnieder/guitarchordschemes/ +E-Mail: contact@mychemistry.eu +-------------------------------------------------------------------------- +Copyright 2013 Clemens Niederberger + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This work has the LPPL maintenance status `maintained'. + +The Current Maintainer of this work is Clemens Niederberger. +-------------------------------------------------------------------------- +The guitarchordschemes package consists of the files + - guitarchordschemes.sty, + - guitarchordschemes_en.tex, guitarchordschemes_en.pdf + - README +-------------------------------------------------------------------------- +If you have any ideas, questions, suggestions or bugs to report, please +feel free to contact me. +-------------------------------------------------------------------------- diff --git a/Master/texmf-dist/doc/latex/guitarchordschemes/guitarchordschemes_en.pdf b/Master/texmf-dist/doc/latex/guitarchordschemes/guitarchordschemes_en.pdf Binary files differnew file mode 100644 index 00000000000..87c0de8bbaf --- /dev/null +++ b/Master/texmf-dist/doc/latex/guitarchordschemes/guitarchordschemes_en.pdf diff --git a/Master/texmf-dist/doc/latex/guitarchordschemes/guitarchordschemes_en.tex b/Master/texmf-dist/doc/latex/guitarchordschemes/guitarchordschemes_en.tex new file mode 100644 index 00000000000..18891ca9c46 --- /dev/null +++ b/Master/texmf-dist/doc/latex/guitarchordschemes/guitarchordschemes_en.tex @@ -0,0 +1,442 @@ +% arara: xelatex +% !arara: biber +% !arara: xelatex +% !arara: xelatex +% -------------------------------------------------------------------------- +% the GUITARCHORDSCHEMES package +% +% Guitar Chord and Scale Tablatures with TikZ +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% Web: https://bitbucket.org/cgnieder/guitarchordschemes/ +% E-Mail: contact@mychemistry.eu +% -------------------------------------------------------------------------- +% Copyright 2012--2013 Clemens Niederberger +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Clemens Niederberger. +% -------------------------------------------------------------------------- +% The guitarchordschemes package consists of the files +% - guitarchordschemes.sty, +% - guitarchordschemes_en.tex, +% - guitarchordschemes_en.pdf, +% - README +% -------------------------------------------------------------------------- +% If you have any ideas, questions, suggestions or bugs to report, please +% feel free to contact me. +% -------------------------------------------------------------------------- +\documentclass[toc=index,toc=bib]{cnpkgdoc} +\docsetup{ + pkg = [use-rbc]guitarchordschemes , + subtitle = Guitar Chord and Scale Tablatures with \TikZ , + code-box = { + backgroundcolor = gray!7!white , + skipbelow = .6\baselineskip plus .5ex minus .5ex , + skipabove = .6\baselineskip plus .5ex minus .5ex , + roundcorner = 3pt , + } , + gobble = 1 +} +\usepackage{polyglossia} +\setmainlanguage{english} +\usepackage[oldstyle,proportional]{libertine} +\usepackage{libertinehologopatch} +\cnpkgusecolorscheme{friendly} + +\setmonofont[Ligatures=TeX,Scale=MatchLowercase]{Bitstream Vera Sans Mono} + +\usepackage{fnpct} +\pagestyle{headings} + +\usepackage[biblatex]{embrac}[2013/03/22] +\ChangeEmph{[}[,.02em]{]}[.055em,-.08em] +\ChangeEmph{(}[-.01em,.04em]{)}[.04em,-.05em] + +\renewcommand*\othersectionlevelsformat[3]{% + \textcolor{main}{#3\autodot}\enskip} +\renewcommand*\partformat{% + \textcolor{main}{\partname~\thepart\autodot}} + +\addcmds{ + chordscheme, + setchordscheme, + scales, + textsuperscript +} + +\usepackage{filecontents} +\usepackage{imakeidx} +\begin{filecontents*}{\jobname.ist} + heading_prefix "{\\bfseries " + heading_suffix "\\hfil}\\nopagebreak\n" + headings_flag 1 + delim_0 "\\dotfill\\hyperpage{" + delim_1 "\\dotfill\\hyperpage{" + delim_2 "\\dotfill\\hyperpage{" + delim_r "}\\textendash\\hyperpage{" + delim_t "}" + suffix_2p "\\nohyperpage{\\,f.}" + suffix_3p "\\nohyperpage{\\,ff.}" +\end{filecontents*} +\indexsetup{othercode=\footnotesize} +\makeindex[options={-s \jobname.ist},intoc,columns=3,columnsep=1em] + +\usepackage[backend=biber,style=alphabetic]{biblatex} +\addbibresource{\jobname.bib} +\begin{filecontents}{\jobname.bib} +@online{web:pietsch:fonts, + author = {Jochen Pietsch} , + title = {Jazz Fonts} , + url = {http://notation.jochenpietsch.de/index_e.html} , + urldate = {2012-05-10} +} +@package{pkg:etoolbox, + title = {\paket*{etoolbox}}, + author = {Philipp Lehman}, + date = {2011-01-21}, + version = {2.1}, + url = {http://mirror.ctan.org/macros/latex/contrib/etoolbox} +} +@package{pkg:pgfopts, + title = {\paket*{pgfopts}}, + author = {Joseph Wright}, + date = {2011-06-02}, + version = {2.1}, + url = {http://mirror.ctan.org/macros/latex/contrib/pgfopts} +} +@package{pkg:realbookchords, + title = {\paket*{realbookchords}}, + author = {Clemens Niederberger}, + date = {2013-04-29}, + version = {0.1}, + url = {https://bitbucket.org/cgnieder/guitarchordschemes/} +} +@package{pkg:tikz, + author = {Till Tantau and Mark Wibrow and Christian Feuersänger}, + title = {Ti\textit{k}Z/pgf}, + sorttitle = {TikZ}, + version = {2.10}, + date = {2010-02-25}, + url = {http://sourceforge.net/projects/pgf/}, + urldate = {2013-04-18} +} +@book{leavitt:mmfg:1, + author = {William G. Leavitt}, + title = {A Modern Method for Guitar}, + volume = {1}, + publisher = {Berklee Press Publications, Boston}, + year = {1966} +} +\end{filecontents} + + +\let\verb\lstinline +\makeatletter +\def\TikZ@logo{Ti\textit{k}Z} +\renewrobustcmd\TikZ{\TikZ@logo\index{TikZ@\TikZ@logo}} +\makeatother + +\usepackage{ccicons} + +\usepackage{acro,accsupp} +\DeclareAcronym{ctan}{ + short = ctan , + long = the \textsc{Comprehensive \TeX{} Archive Network} , + short-format = \scshape , + pdfstring = CTAN , + accsupp = CTAN +} +\acsetup{first-style=footnote} + +\setchordscheme{ + finger-format+=\biolinumLF , + name-format+=\libertineLF +} + +\TitlePicture{% +\chordscheme[ + name = Gmi7 , + position = II , + barre = {2/2-4:3} , + show-root = {4/4} , + root = {2/6:2} , + mute = {1,5} +]} +\begin{document} + +\section{License and Requirements} + +\guitarchordschemes is placed under the terms of the \LaTeX{} Project Public License, +version 1.3 or later (\url{http://www.latex-project.org/lppl.txt}). +It has the status “maintained”. + +\guitarchordschemes loads the packages \TikZ~\cite{pkg:tikz}, +\paket*{etoolbox}~\cite{pkg:etoolbox} and \paket*{pgfopts}~\cite{pkg:pgfopts}. +It also loads the \TikZ{} libraries \code{shapes.misc}, \code{arrows} and \code{calc}. +Depending on an option it also loads \paket*{realbookchords}~\cite{pkg:realbookchords}. +This package is not yet published on \ac{ctan} and thus not part of any \TeX{} +distribution. Until it is you can find it at +\url{https://bitbucket.org/cgnieder/realbookchords/}. +See section~\ref{sec:realbookchords} for details on this option. + +\section{The Commands} +This package more or less provides a single command: +\begin{beschreibung} + \Befehl{chordscheme}[<options>] + \Befehl{scales}[<option>] +\end{beschreibung} +These commands set the frame for the chord and scale tablatures and can be used +to create sheets for manually writing down tablatures: +\begin{beispiel} + \chordscheme +\end{beispiel} + +Similarly \cmd{scales} creates a frame with two more frets: +\begin{beispiel}[below] + \scales +\end{beispiel} + +\subsection{Options for \cmd*{chordscheme}} +The \oa{options} argument is where the actual details for a chord happen. These +are the available ones for \cmd{chordscheme}: +\begin{beschreibung} + \Option{name}{<chordsymbol>}\newline + Set the chord symbol. This option accepts a list of entries. + \Option{position}{<position>}\newline + Set the position for the first of the four frets. + \Option{finger}{<fret>/<string>:<label>}\newline + Specify the finger positions for a chord. This option accepts a list of entries. + The \code{:<label>} is optional. + \Option{root}{<fret>/<string>:<label>}\newline + The same as finger but uses a square instead of a circle to indicate that + this finger is playing the root of the chord. This option accepts a list of + entries. The \code{:<label>} is optional. + \Option{show-root}{<fret>/<string>}\newline + Specify positions of the root that are \emph{not} part of the actual chord + but are somewhere in the vicinity of it on the guitar neck. This option + accepts a list of entries. + \Option{barre}{<fret>/<string range>:<label>}\newline + Specify a barr\'e position for a chord. The \code{<string range>} part must + contain a two string numbers separated with a dash. This option accepts a list + of entries. The \code{:<label>} is optional. + \Option{ring}{<string>}\newline + Specify open strings. This option accepts a list of entries. + \Option{mute}{<string>}\newline + Specify muted/un-played strings This option accepts a list of entries. +\end{beschreibung} + +Let's take a look at a few examples: + +\setchordscheme{use-rbc=false} +\begin{beispiel} + \chordscheme[ + name = G , + position = I , + finger = {2/5:1} , + root = {3/6:2, 3/1:4} , + ring = {2,3,4} + ] +\end{beispiel} + +Or a more “jazzy” chord: +\begin{beispiel} + \chordscheme[ + name = G\textsuperscript{6} , + position = II , + finger = {1/4:1, 3/3:4, 2/2:3} , + root = 2/6:2 , + show-root = 4/4 , + mute = {1,5} + ] +\end{beispiel} + +One with a barr\'e: + +\begin{beispiel} + \chordscheme[ + name = Gmi\textsuperscript{7} , + position = II , + barre = 2/2-4:3 , + show-root = 4/4 , + root = 2/6:2 , + mute = {1,5} + ] +\end{beispiel} + +\subsection{Options for \cmd*{scales}} +The \oa{options} argument for \cmd{scales} are similar to the ones for +\cmd{chordscheme}: +\begin{beschreibung} + \Option{name}{<title>}\newline + Set a title for the scale. + \Option{position}{<position>}\newline + Set the position for the first of the six frets. + \Option{finger}{<fret>/<string>:<label>}\newline + Specify the finger positions for the scale. This option accepts a list of entries. + The \code{:<label>} is optional. + \Option{root}{<fret>/<string>:<label>}\newline + The same as finger but uses a square instead of a circle to indicate that + this finger is playing the root of the scale. This option accepts a list of + entries. The \code{:<label>} is optional. + \Option{fret number}{<integer>}\Default{6} + The number of frets displayed for a scale. The minimum number is 6. + \Option{fingering}{type 1|type 1A|type 2|type 3|type 4}\newline + Set a whole predefined fingering. The types correspond to ones taught + in \citeauthor{leavitt:mmfg:1}'s \citetitle{leavitt:mmfg:1}~\cite{leavitt:mmfg:1}. + This option assumes an ionic scale a places the roots correspondingly. + \Option{fingering*}{type 1|type 1A|type 2|type 3|type 4}\newline + The same as \key{fingering} but not scale is assumed and no roots are + indicated. + \Option{fingering?}{type 1|type 1A|type 2|type 3|type 4}\newline + The same as \key{fingering*} but also no labels for the fingers are given. +\end{beschreibung} + +Let's see an example: +\begin{beispiel}[below] + \scales[ + name = F-major (Fingering Type~1A) , + position = I , + fingering = type 1A + ] +\end{beispiel} + +An example for \key{fingering*}: +\begin{beispiel}[below] + \scales[ + name = Fingering Type~3 , + fingering* = type 3 + ] +\end{beispiel} + +Now an example for \key{fingering?}: +\begin{beispiel}[below] + \scales[ + name = Fingering Type~2 , + fingering? = type 2 + ] +\end{beispiel} + +At last an example for an explicitly set scale: +\begin{beispiel}[below] + \scales[ + finger = { + 2/1:1, 5/1:4, + 2/2:1, 5/2:4, + 2/3:1, 4/3:3, 5/3:4, + 2/4:1, 4/4:3, + 2/5:1, 3/5:2, 4/5:3, + 2/6:1, 5/6:4 + } + ] +\end{beispiel} + + +\section{Options} +There are quite a number of options determining the layout of the tablatures. +They can either be set as package options or via the setup command: +\begin{beschreibung} + \Befehl{setchordscheme}{<options>} +\end{beschreibung} + +Below every option and its corresponding default setting is described. +\begin{beschreibung} + \Option{x-unit}{<dim>}\Default{.8cm} + The basic $x$ unit for the \TikZ{} picture the chord scheme is set in. + \Option{y-unit}{<dim>}\Default{.8cm} + The basic $y$ unit for the \TikZ{} picture the chord scheme is set in. + \Option{finger-format}{<TeX code>}\Default{\cmd*{sffamily}\cmd*{small}} + The format the numbers for the fingers are typeset with. + \Option{finger-format+}{<TeX code>}\Default{} + Code to be appended to \key{finger-format}. + \Option{position-format}{<TeX code>}\Default{\cmd*{sffamily}} + The format the number for the position is typeset with. + \Option{position-format+}{<TeX code>}\Default{} + Code to be appended to \key{position-format}. + \Option{name-format}{<TeX code>}\Default{\cmd*{large}} + The format the chord name/symbol is typeset with. + \Option{name-format+}{<TeX code>}\Default{} + Code to be appended to \key{name-format}. + \Option{string-name-format}{<TeX code>}\Default{\cmd*{sffamily}\cmd*{small}} + The format the names of the strings are typeset with. + \Option{string-name-format+}{<TeX code>}\Default{} + Code to be appended to \key{string-name-format}. + \Option{line-width}{<dim>}\Default{1pt} + The line width used for all lines drawn in the chord scheme. + \Option{finger-radius}{<dim>}\Default{.1875} + The radius of the circles that represent the fingers in multiples of + \key{x-unit}. Also determines the size of the root markers and the barr\'e. + \Option{finger-x-offset}{<dim>}\Default{.375} + The $x$ offset of the number with respect to the circle in multiples of + \key{x-unit}. + \Option{finger-y-offset}{<dim>}\Default{.375} + The $y$ offset of the number with respect to the circle in multiples of + \key{y-unit}. + \Option{finger-style}{<tikz style>}\Default{fill} + The \TikZ{} style the circles representing the fingers are drawn with. + This is equivalent to\linebreak \cmd{tikzset}{finger style/.style=\{<tikz style>\}}. + \Option{root-style}{<tikz style>}\Default{fill} + The \TikZ{} style the squares representing the roots are drawn with. + This is equivalent to\linebreak \cmd{tikzset}{root style/.style=\{<tikz style>\}}. + \Option{show-root-style}{<tikz style>}\Default{draw} + The \TikZ{} style the squares representing the “ghost roots” are drawn with. + This is equivalent to \cmd{tikzset}{show root style/.style=\{<tikz style>\}}. + \Option{ringing-style}{<tikz style>}\Default{draw} + The \TikZ{} style the circles representing the open string markers are drawn + with. This is equivalent to \cmd{tikzset}{ringing style/.style=\{<tikz style>\}}. + \Option{muted-style}{<tikz style>}\Default{\{cross out,draw\}} + The \TikZ{} style the nodes representing muted strings are drawn with. + This is equivalent to \cmd{tikzset}{muted style/.style=\{<tikz style>\}}. + \Option{tuning}{<comma list of string names>}\Default{\{E,B,G,D,A,E\}} + The tuning. + \Option{use-rbc}{\default{true}|false}\Default{false} + If set to true the \key{name} will be set in the command \cmd{rbc} from the + \paket*{realbookchords}. If this option is not used as a package option + then make sure you also load \paket*{realbookchords}~\cite{pkg:realbookchords}. + Please be aware that the latter requires \XeLaTeX{} or \LuaLaTeX. See + section~\ref{sec:realbookchords} for details. +\end{beschreibung} + +\section{Using \paket*{realbookchords}}\label{sec:realbookchords} +Setting \cmd{setchordscheme}{use-rbc=true} or using the same as package option +will set the chord names/symbols in \paket*{realbookchords}' command \cmd{rbc}. + +In order to use this option you need to install the \paket*{realbookchords} +package~\cite{pkg:realbookchords}. I expect it to go to \ac{ctan} eventually but +until then you can get it at \url{https://bitbucket.org/cgnieder/realbookchords/}. +The package uses Jochen Pietsch's “New Real Book” font~\cite{web:pietsch:fonts} +for typesetting the chord symbols which you can get at +\url{http://notation.jochenpietsch.de/} or from me. I published it here: \url{http://www.niederberger.com.de/gitarren-akkorde-und-skalen-mit-latex}. +It is placed under the Creative Commons Attribution-Noncommercial-Share Alike~3.0 +Unported License \ccbyncsaeu. + +\paket*{realbookchords} requires that you compile your document with \XeLaTeX{} +or \LuaLaTeX. + +Here is an example of how the chord symbol looks with \paket*{realbookchords}: +\begin{beispiel} + \setchordscheme{use-rbc=true} + \chordscheme[ + name = Gmi7(\b5) , + position = II , + finger = {1/2:1, 2/3:4, 2/4:3} , + show-root = {4/4} , + root = {2/6:2} , + mute = {1,5} + ] +\end{beispiel} + +\printbibliography + +\printindex + +\end{document} diff --git a/Master/texmf-dist/tex/latex/guitarchordschemes/guitarchordschemes.sty b/Master/texmf-dist/tex/latex/guitarchordschemes/guitarchordschemes.sty new file mode 100644 index 00000000000..8e6f9e75a61 --- /dev/null +++ b/Master/texmf-dist/tex/latex/guitarchordschemes/guitarchordschemes.sty @@ -0,0 +1,594 @@ +% -------------------------------------------------------------------------- +% the GUITARCHORDSCHEMES package +% +% Guitar Chord and Scale Tablatures with TikZ +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% Web: https://bitbucket.org/cgnieder/guitarchordschemes/ +% E-Mail: contact@mychemistry.eu +% -------------------------------------------------------------------------- +% Copyright 2013 Clemens Niederberger +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Clemens Niederberger. +% -------------------------------------------------------------------------- +% The guitarchordschemes package consists of the files +% - guitarchordschemes.sty, +% - guitarchordschemes_en.tex, +% - guitarchordschemes_en.pdf, +% - README +% -------------------------------------------------------------------------- +% If you have any ideas, questions, suggestions or bugs to report, please +% feel free to contact me. +% -------------------------------------------------------------------------- +% +% package info and requirements: +\NeedsTeXFormat{LaTeX2e} +\def\gcs@date{2013/08/25} +\def\gcs@version{v0.4} +\def\gcs@description{Guitar Chord and Scale Tablatures with TikZ (CN)} + +\ProvidesPackage{guitarchordschemes}[\gcs@date\space \gcs@version\space \gcs@description] + +\RequirePackage{tikz,etoolbox,pgfopts} +\usetikzlibrary{shapes.misc,arrows,calc} +% -------------------------------------------------------------------------- +% message handling +\def\gcs@create@message#1{% + \ifstrequal{#1}{Error} + {% + \lowercase{\csdef{gcs@#1}}##1##2{% + \csuse{Package#1}{guitarchordschemes}{##1}{##2}}% + }{% + \lowercase{\csdef{gcs@#1}}##1{% + \csuse{Package#1}{guitarchordschemes}{##1}}% + }} +\gcs@create@message{Error} +\gcs@create@message{Warning} +\gcs@create@message{WarningNoLine} +\gcs@create@message{Info} + +\def\gcs@missing@date@error#1#2{% + \gcs@error + {#1: empty #2} + {#1: It seems you didn't specify the #2}% +} + +\def\gcs@cs@new{\protected\def} + +% -------------------------------------------------------------------------- +% package options and setup: +\newbool{gcs@rbc} + +\def\gcs@finger@font{\sffamily\small} +\def\gcs@position@font{\sffamily} +\def\gcs@name@font{\large} +\def\gcs@string@name@format{\sffamily\small} + +\def\gcs@x@unit{.8cm} +\def\gcs@y@unit{.8cm} +\def\gcs@line@width{1pt} +\def\gcs@finger@radius{.1875} +\def\gcs@finger@x@offset{.375} +\def\gcs@finger@y@offset{.275} + +\pgfkeys{ + guitarchordschemes/.cd , + x-unit/.code = \def\gcs@x@unit{#1} , + y-unit/.code = \def\gcs@y@unit{#1} , + finger-format/.code = \def\gcs@finger@font{#1} , + finger-format+/.code = + \expandafter\def\expandafter\gcs@finger@font + \expandafter{\gcs@finger@font#1} , + position-format/.code = \def\gcs@position@font{#1} , + position-format+/.code = + \expandafter\def\expandafter\gcs@position@font + \expandafter{\gcs@position@font#1} , + name-format/.code = \def\gcs@name@font{#1} , + name-format+/.code = + \expandafter\def\expandafter\gcs@name@font + \expandafter{\gcs@name@font#1} , + string-name-format/.code = \def\gcs@string@name@format{#1} , + string-name-format+/.code = + \expandafter\def\expandafter\gcs@string@name@format + \expandafter{\gcs@string@name@format#1} , + line-width/.code = \def\gcs@line@width{#1} , + finger-radius/.code = \def\gcs@finger@radius{#1} , + finger-x-offset/.code = \def\gcs@finger@x@offset{#1} , + finger-y-offset/.code = \def\gcs@finger@y@offset{#1} , + finger-style/.code = \tikzset{finger style/.style={#1}} , + root-style/.code = \tikzset{root style/.style={#1}} , + show-root-style/.code = \tikzset{show root style/.style={#1}} , , + ringing-style/.code = \tikzset{ringing style/.style={#1}} , + muted-style/.code = \tikzset{muted style/.style={#1}} , + tuning/.code = \gcs@chord@tuning{#1} , + use-rbc/.is if = gcs@rbc +} + +% the setup command: +\newrobustcmd*\setchordscheme[1]{\pgfqkeys{/guitarchordschemes}{#1}} + +\newcounter{gcs@string@number} +\newcommand\gcs@chord@tuning[1]{% + \setcounter{gcs@string@number}{0}% + \foreach \string@name in {#1} + {% + \stepcounter{gcs@string@number}% + \csxdef{guitar@string@\arabic{gcs@string@number}}{\expandonce\string@name}% + }% +} + +% some defaults - need to be set before options are processed: +\setchordscheme{ + tuning = {E,B,G,D,A,E} , + muted-style = {cross out,draw} , + root-style = {fill} , + show-root-style = {draw} , + ringing-style = {draw} , + finger-style = {fill} +} + +\ProcessPgfOptions* + +% -------------------------------------------------------------------------- +% are we using `realbookchords'? +\ifbool{gcs@rbc}{\RequirePackage{realbookchords}}{} + +% -------------------------------------------------------------------------- +% settings for the whole scheme: +\tikzset{ + gcs/finger/.style = + { + xshift = \gcs@finger@x@offset*\gcs@x@unit , + yshift = \gcs@finger@y@offset*\gcs@y@unit , + font = \gcs@finger@font + } +} + +% setting a chord scheme: +\pgfkeys{ + gcs/chord/.cd , + name/.code = \gcs@chord@name{#1} , + position/.code = \def\gcs@chord@position{#1} , + finger/.code = \gcs@chord@finger{#1} , + root/.code = \gcs@chord@root{#1} , + show-root/.code = \gcs@chord@show@root{#1} , + mute/.code = \gcs@chord@mute{#1} , + ring/.code = \gcs@chord@ring{#1} , + barre/.code = \gcs@chord@barre{#1} +} + +% setting a scale: +\pgfkeys{ + gcs/scales/.cd , + name/.code = \gcs@scales@name{#1} , + position/.code = \def\gcs@scales@position{#1} , + finger/.code = \gcs@scales@finger{#1} , + root/.code = \gcs@scales@root{#1} , + fret number/.code = + \ifnumless{#1}{6} + {% + \gcs@warning{You cannot use less than 6 frets for a scale!}% + \def\gcs@scales@fret@number{6}% + } + {\def\gcs@scales@fret@number{#1}} , + fingering/.is choice , + fingering/type 1/.code = + \gcs@scales@finger{% + 1/1:1s, 3/1:2, 5/1:4, + 3/2:2, 5/2:4, + 2/3:1, 4/3:3, + 2/4:1, 3/4:2, 5/4:4, + 2/5:1, 5/5:4, + 1/6:1s, 3/6:2, 5/6:4 + }% + \gcs@scales@root{5/3:4, 3/5:2} , + fingering/type 1A/.code = + \gcs@scales@finger{% + 3/1:2, 5/1:4, + 3/2:2, 5/2:4, + 2/3:1, 3/3:2, 5/3:4, + 2/4:1, 5/4:4, + 1/5:1s, 3/5:2, 5/5:4, + 3/6:2, 5/6:4 + }% + \gcs@scales@root{1/1:1s, 3/4:2, 1/6:1s} , + fingering/type 2/.code = + \gcs@scales@finger{% + 2/1:1, 5/1:4, + 3/2:2, 5/2:4, + 2/3:1, 4/3:3, 5/3:4, + 2/4:1, 4/4:3, + 2/5:1, 3/5:2, 5/5:4, + 2/6:1, 5/6:4 + }% + \gcs@scales@root{3/1:2, 5/4:4, 3/6:2}, + fingering/type 3/.code = + \gcs@scales@finger{% + 2/1:1, 3/1:2, 5/1:4, + 2/2:1, 5/2:4, + 2/3:1, 4/3:3, + 2/4:1, 4/4:3, 5/4:4, + 2/5:1, 4/5:3, + 2/6:1, 3/6:2, 5/6:4 + }% + \gcs@scales@root{3/2:2, 5/5:4}, + fingering/type 4/.code = + \gcs@scales@finger{% + 2/1:1, 4/1:3, + 2/2:1, 3/2:2, 5/2:4, + 4/3:3, + 2/4:1, 4/4:3, 6/4:4s, + 2/5:1, 4/5:3, 5/5:4, + 2/6:1, 4/6:3 + }% + \gcs@scales@root{5/1:4, 2/3:1, 5/6:4}, + fingering*/.is choice , + fingering*/type 1/.code = + \gcs@scales@finger{% + 1/1:1s, 3/1:2, 5/1:4, + 3/2:2, 5/2:4, + 2/3:1, 4/3:3, 5/3:4, + 2/4:1, 3/4:2, 5/4:4, + 2/5:1, 3/5:2, 5/5:4, + 1/6:1s, 3/6:2, 5/6:4 + } , + fingering*/type 1A/.code = + \gcs@scales@finger{% + 1/1:1s, 3/1:2, 5/1:4, + 3/2:2, 5/2:4, + 2/3:1, 3/3:2, 5/3:4, + 2/4:1, 3/4:2, 5/4:4, + 1/5:1s, 3/5:2, 5/5:4, + 1/6:1s, 3/6:2, 5/6:4 + } , + fingering*/type 2/.code = + \gcs@scales@finger{% + 2/1:1, 3/1:2, 5/1:4, + 3/2:2, 5/2:4, + 2/3:1, 4/3:3, 5/3:4, + 2/4:1, 4/4:3, 5/4:4, + 2/5:1, 3/5:2, 5/5:4, + 2/6:1, 3/6:2, 5/6:4 + } , + fingering*/type 3/.code = + \gcs@scales@finger{% + 2/1:1, 3/1:2, 5/1:4, + 2/2:1, 3/2:2, 5/2:4, + 2/3:1, 4/3:3, + 2/4:1, 4/4:3, 5/4:4, + 2/5:1, 4/5:3, 5/5:4, + 2/6:1, 3/6:2, 5/6:4 + } , + fingering*/type 4/.code = + \gcs@scales@finger{% + 2/1:1, 4/1:3, 5/1:4, + 2/2:1, 3/2:2, 5/2:4, + 2/3:1, 4/3:3, + 2/4:1, 4/4:3, 6/4:4s, + 2/5:1, 4/5:3, 5/5:4, + 2/6:1, 4/6:3, 5/6:4 + }, + fingering?/.is choice , + fingering?/type 1/.code = + \gcs@scales@finger{% + 1/1, 3/1, 5/1, + 3/2, 5/2, + 2/3, 4/3, 5/3, + 2/4, 3/4, 5/4, + 2/5, 3/5, 5/5, + 1/6, 3/6, 5/6 + } , + fingering?/type 1A/.code = + \gcs@scales@finger{% + 1/1, 3/1, 5/1, + 3/2, 5/2, + 2/3, 3/3, 5/3, + 2/4, 3/4, 5/4, + 1/5, 3/5, 5/5, + 1/6, 3/6, 5/6 + } , + fingering?/type 2/.code = + \gcs@scales@finger{% + 2/1, 3/1, 5/1, + 3/2, 5/2, + 2/3, 4/3, 5/3, + 2/4, 4/4, 5/4, + 2/5, 3/5, 5/5, + 2/6, 3/6, 5/6 + } , + fingering?/type 3/.code = + \gcs@scales@finger{% + 2/1, 3/1, 5/1, + 2/2, 3/2, 5/2, + 2/3, 4/3, + 2/4, 4/4, 5/4, + 2/5, 4/5, 5/5, + 2/6, 3/6, 5/6 + } , + fingering?/type 4/.code = + \gcs@scales@finger{% + 2/1, 4/1, 5/1, + 2/2, 3/2, 5/2, + 2/3, 4/3, + 2/4, 4/4, 6/4, + 2/5, 4/5, 5/5, + 2/6, 4/6, 5/6 + } +} + +% -------------------------------------------------------------------------- +% the internal commands + +% placing fingers: +% <fret>/<string>:<finger> +\gcs@cs@new\gcs@chord@finger#1{% + \foreach \gcs@finger@spec in {#1} + { + \expandafter\gcs@get@finger@data\gcs@finger@spec::\q@stop + \ifdefvoid\finger@x + {\gcs@missing@date@error{finger}{position}} + { + \pgfmathsetmacro\finger@fret{1.5*\finger@x-0.75} + \ifdefvoid\finger@y + {\gcs@missing@date@error{finger}{string}} + { + \pgfmathsetmacro\finger@string{(6-\finger@y)*4/5} + \draw[finger style] + (\finger@fret,\finger@string) circle (\gcs@finger@radius*\gcs@x@unit) ; + \node[gcs/finger] at (\finger@fret,\finger@string) {\finger@number} ; + } + } + } +} +\let\gcs@scales@finger\gcs@chord@finger + +\gcs@cs@new\gcs@get@finger@data#1/#2:#3:#4\q@stop{% + \def\finger@x{#1}% + \def\finger@y{#2}% + \def\finger@number{#3}% +} + +% placing a barre: +% <fret>/<string>-<string>:<finger> +\gcs@cs@new\gcs@chord@barre#1{% + \foreach \gcs@barre@spec in {#1} + { + \expandafter\gcs@get@barre@data\gcs@barre@spec::\q@stop + \ifdefvoid\barre@x + {\gcs@missing@date@error{barre}{position}} + {\pgfmathsetmacro\barre@fret{1.5*\barre@x-0.75}} + \ifdefvoid\barre@fromto + {\gcs@missing@date@error{barre}{string range}} + { + \expandafter\gcs@barre@getstrings\barre@fromto--\q@stop + \pgfmathsetmacro\barre@lower@string{(6-\barre@lower@y)*4/5} + \pgfmathsetmacro\barre@upper@string{(6-\barre@upper@y)*4/5} + \draw[finger style,round cap-round cap,line width=2*\gcs@finger@radius*\gcs@x@unit] + (\barre@fret,\barre@lower@string) node[gcs/finger] {\barre@finger} + ++ (0,\gcs@finger@radius*\gcs@x@unit) + -- + ($(\barre@fret,\barre@upper@string)+(0,-\gcs@finger@radius*\gcs@x@unit)$) + ; + } + } +} + +\gcs@cs@new\gcs@get@barre@data#1/#2:#3:#4\q@stop{% + \def\barre@x{#1}% + \def\barre@fromto{#2}% + \def\barre@finger{#3}% +} + +\gcs@cs@new\gcs@barre@getstrings#1-#2-#3\q@stop{% + \ifx#3-\relax + \def\barre@lower@y{#1}% + \def\barre@upper@y{#2}% + \else + \gcs@error + {barre: wrong string range syntax} + {barre: wrong string range syntax}% + \fi +} + +% placing root fingers: +% <fret>/<string>:<finger> +\gcs@cs@new\gcs@chord@root#1{% + \foreach \gcs@finger@spec in {#1} + { + \expandafter\gcs@get@finger@data\gcs@finger@spec::\q@stop + \ifdefvoid\finger@x + {\gcs@missing@date@error{root}{position}} + { + \pgfmathsetmacro\finger@fret{1.5*\finger@x-0.75} + \ifdefvoid\finger@y + {\gcs@missing@date@error{root}{string}} + { + \pgfmathsetmacro\finger@string{(6-\finger@y)*4/5} + \node[minimum size=2*\gcs@finger@radius*\gcs@x@unit,root style] + at (\finger@fret,\finger@string) {} ; + \node[gcs/finger] at (\finger@fret,\finger@string) {\finger@number} ; + } + } + } +} +\let\gcs@scales@root\gcs@chord@root + +% placing ghost roots: +% <fret>/<string> +\gcs@cs@new\gcs@chord@show@root#1{% + \foreach \gcs@finger@spec in {#1} + { + \expandafter\gcs@get@finger@data\gcs@finger@spec::\q@stop + \ifdefvoid\finger@x + {\gcs@missing@date@error{show-root}{position}} + { + \pgfmathsetmacro\finger@fret{1.5*\finger@x-0.75} + \ifdefvoid\finger@x + {\gcs@missing@date@error{show-root}{string}} + { + \pgfmathsetmacro\finger@string{(6-\finger@y)*4/5} + \node[minimum size=2*\gcs@finger@radius*\gcs@x@unit,show root style] + at (\finger@fret,\finger@string) {} ; + } + } + } +} + +% muted strings: +\gcs@cs@new\gcs@chord@mute#1{% + \foreach \muted@string in {#1} + { + \pgfmathsetmacro\muted@string@pos{(6-\muted@string)*4/5} + \node[muted style] at (0,\muted@string@pos) {} ; + } +} + +% ringing strings: +\gcs@cs@new\gcs@chord@ring#1{% + \foreach \ringing@string in {#1} + { + \pgfmathsetmacro\ringing@string@pos{(6-\ringing@string)*4/5} + \draw[ringing style] + (0,\ringing@string@pos) circle (\gcs@finger@radius*\gcs@x@unit) ; + } +} + +% the chord name: +\gcs@cs@new\gcs@chord@name#1{% + \node[above,yshift=4ex] at (3,4) {% + \foreach \gcs@chord@name@variant in {#1} + {% + \gcs@name@font + \space + \ifbool{gcs@rbc} + {\expandafter\rbc\expandafter{\gcs@chord@name@variant}} + {\gcs@chord@name@variant}% + \space + }% + } ; +} + +% the scale name: +\gcs@cs@new\gcs@scales@name#1{% + \node[above,yshift=4ex] at (4.5,4) {% + \foreach \gcs@scales@name@variant in {#1} + {% + \gcs@name@font + \space + \gcs@scales@name@variant + \space + }% + } ; +} + +% -------------------------------------------------------------------------- +% the chord scheme command: +\gcs@cs@new\gcs@chordscheme#1{% +\begingroup +\begin{tikzpicture}[ + x=\gcs@x@unit, + y=\gcs@y@unit, + line width=\gcs@line@width, + baseline=(6thstring) + ] + \coordinate (6thstring) at (0,0) ; + \foreach \fret in { 0,1.5,3,4.5,6 } + { \draw (\fret,0) -- (\fret,4) ; } + \foreach \string@pos/\string@number in + { 0/6, 0.8/5, 1.6/4, 2.4/3, 3.2/2, 4/1, 0 } + { + \draw (0,\string@pos) node[left,minimum width=2em] + {\gcs@string@name@format\csuse{guitar@string@\string@number}} -- (6,\string@pos) ; + } + \pgfqkeys{/gcs/chord}{#1}% + \ifdefvoid\gcs@chord@position + {} + {\node[above,yshift=1ex,font=\gcs@position@font] at (.75,4) {\gcs@chord@position} ;} +\end{tikzpicture} +\endgroup +} + +% -------------------------------------------------------------------------- +% the scalescommand: +\def\gcs@scales@fret@number{6} + +\gcs@cs@new\gcs@scales#1{% + \begingroup + \begin{tikzpicture}[ + x=\gcs@x@unit, + y=\gcs@y@unit, + line width=\gcs@line@width, + baseline=(6thstring) + ] + \pgfqkeys{/gcs/scales}{#1}% + \coordinate (6thstring) at (0,0) ; + \foreach \fret in { 0,1,...,\gcs@scales@fret@number } + { \draw (1.5*\fret,0) -- (1.5*\fret,4) ; } + \foreach \string@pos/\string@number in + { 0/6, 0.8/5, 1.6/4, 2.4/3, 3.2/2, 4/1, 0 } + { + \draw (0,\string@pos) node[left,minimum width=2em] + {\gcs@string@name@format\csuse{guitar@string@\string@number}} + -- (1.5*\gcs@scales@fret@number,\string@pos) ; + } + \ifdefvoid\gcs@scales@position + {} + {% + \node[above,yshift=1ex,font=\gcs@position@font] at (.75,4) + {\gcs@scales@position} ; + } + \end{tikzpicture} + \endgroup +} + +% -------------------------------------------------------------------------- +% the user commands: +\newrobustcmd*\chordscheme[1][]{\gcs@chordscheme{#1}} + +\newrobustcmd*\scales[1][]{\gcs@scales{#1}} + +% -------------------------------------------------------------------------- +% the symbols for use outside of a scheme: +\newrobustcmd*\fingersymbol{% + \tikz\draw[finger style] (0,0) circle (\gcs@finger@radius*\gcs@x@unit);} + +\newrobustcmd*\rootsymbol{% + \tikz\node[root style,minimum size=2*\gcs@finger@radius*\gcs@x@unit] at (0,0) {} ;} + +\newrobustcmd*\showrootsymbol{% + \tikz\node[ + show root style, + minimum size=2*\gcs@finger@radius*\gcs@x@unit, + line width=\gcs@line@width] at (0,0) {} ;} + +\newrobustcmd*\ringingstring{% + \tikz\draw[ + ringing style, + line width=\gcs@line@width] (0,0) circle (\gcs@finger@radius*\gcs@x@unit);} + +\newrobustcmd*\mutedstring{% + \tikz\node[ + muted style, + line width=\gcs@line@width] at (0,0) {};} + +\endinput +% -------------------------------------------------------------------------- +% HISTORY +2013/04/28 v0.1 - first version +2013/04/29 v0.1a - added error handling and messages +2013/04/30 v0.2 - it's stupid to set colors explicitly -- better define TikZ + styles for this +2013/05/01 v0.3 - added \scales command +2013/05/01 v0.3a - set all lengths as multiples of the base unit +2013/08/25 v0.4 - added scale option that allows variable number of frets |