-
Notifications
You must be signed in to change notification settings - Fork 10
/
tabr-prog-nw.html
338 lines (312 loc) · 32.5 KB
/
tabr-prog-nw.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
<!DOCTYPE html>
<!-- Generated by pkgdown: do not edit by hand --><html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Noteworthiness • tabr</title>
<!-- favicons --><link rel="icon" type="image/png" sizes="16x16" href="../favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="../favicon-32x32.png">
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="../apple-touch-icon.png">
<link rel="apple-touch-icon" type="image/png" sizes="120x120" href="../apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" type="image/png" sizes="76x76" href="../apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" type="image/png" sizes="60x60" href="../apple-touch-icon-60x60.png">
<!-- jquery --><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script><!-- Bootstrap --><link href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/cosmo/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha256-nuL8/2cJ5NDSSwnKD8VqreErSWHtnEP9E7AySL+1ev4=" crossorigin="anonymous"></script><!-- bootstrap-toc --><link rel="stylesheet" href="../bootstrap-toc.css">
<script src="../bootstrap-toc.js"></script><!-- Font Awesome icons --><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css" integrity="sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css" integrity="sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=" crossorigin="anonymous">
<!-- clipboard.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js" integrity="sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=" crossorigin="anonymous"></script><!-- headroom.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js" integrity="sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js" integrity="sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=" crossorigin="anonymous"></script><!-- pkgdown --><link href="../pkgdown.css" rel="stylesheet">
<script src="../pkgdown.js"></script><link href="../extra.css" rel="stylesheet">
<meta property="og:title" content="Noteworthiness">
<meta property="og:description" content="tabr">
<meta property="og:image" content="https://leonawicz.github.io/tabr/logo.png">
<!-- mathjax --><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js" integrity="sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js" integrity="sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=" crossorigin="anonymous"></script><!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body data-spy="scroll" data-target="#toc">
<div class="container template-article">
<header><div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<span class="navbar-brand">
<a class="navbar-link" href="../index.html">tabr</a>
<span class="version label label-default" data-toggle="tooltip" data-placement="bottom" title="Released version">0.4.5</span>
</span>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>
<a href="../index.html">
<span class="fas fa-home"></span>
Home
</a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
Tutorials
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li class="dropdown-header">Programming</li>
<li>
<a href="../articles/tabr-prog-nw.html">Noteworthiness</a>
</li>
<li>
<a href="../articles/tabr-prog-scales.html">Musical scales</a>
</li>
<li>
<a href="../articles/tabr-prog-notes.html">Note functions</a>
</li>
<li>
<a href="../articles/tabr-prog-chords.html">Chord functions</a>
</li>
<li>
<a href="../articles/tabr-prog-noteinfo.html">Time and note info</a>
</li>
<li>
<a href="../articles/tabr-prog-music.html">The music class</a>
</li>
<li>
<a href="../articles/tabr-prog-converters.html">Syntax converters</a>
</li>
<li>
<a href="../articles/tabr-fretboard.html">Fretboard diagram plots</a>
</li>
<li class="divider">
<li class="dropdown-header">Transcription</li>
<li>
<a href="../articles/tabr-basics.html">Basic overview</a>
</li>
<li>
<a href="../articles/tabr-phrases.html">Musical phrases</a>
</li>
<li>
<a href="../articles/tabr-helpers.html">Phrase helpers</a>
</li>
<li>
<a href="../articles/tabr-chords.html">Chords</a>
</li>
<li>
<a href="../articles/tabr-repeats.html">Repeats</a>
</li>
<li>
<a href="../articles/tabr-tracks-scores.html">Tracks and scores</a>
</li>
<li>
<a href="../articles/tabr-engraving.html">Render scores</a>
</li>
<li>
<a href="../articles/tabr-snippets.html">Music snippets</a>
</li>
<li>
<a href="../articles/tabr-chordchart.html">Render chord chart</a>
</li>
<li>
<a href="../articles/tabr-tunings.html">Strings and tunings</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
Examples
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="../articles/tabr-ex1.html">Tuning and capo</a>
</li>
<li>
<a href="../articles/tabr-ex2.html">Multiple voices</a>
</li>
<li>
<a href="../articles/tabr-ex3.html">AC2 - Ezio's family</a>
</li>
<li>
<a href="../articles/tabr-ex4.html">Gin Wigmore - Devil in me</a>
</li>
</ul>
</li>
<li>
<a href="../reference/index.html">Reference</a>
</li>
<li>
<a href="../news/index.html">Changelog</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li>
<a href="https://github.com/leonawicz/tabr">
<span class="fas fa-github fa-lg"></span>
</a>
</li>
</ul>
</div>
<!--/.nav-collapse -->
</div>
<!--/.container -->
</div>
<!--/.navbar -->
</header><script src="tabr-prog-nw_files/accessible-code-block-0.0.1/empty-anchor.js"></script><div class="row">
<div class="col-md-9 contents">
<div class="page-header toc-ignore">
<h1 data-toc-skip>Noteworthiness</h1>
<small class="dont-index">Source: <a href="https://github.com/leonawicz/tabr/blob/master/vignettes/tabr-prog-nw.Rmd"><code>vignettes/tabr-prog-nw.Rmd</code></a></small>
<div class="hidden name"><code>tabr-prog-nw.Rmd</code></div>
</div>
<p><code>tabr</code> provides a music notation syntax system represented in R code and a collection of music programming functions for generating, manipulating, organizing and analyzing musical information structures in R. While other packages focus on working with acoustic data more generally, <code>tabr</code> provides a framework for creating and working with musical data in a common music notation format. The package offers functions for mapping between pitch and other quantities like frequency and wavelength, but the main purpose is to manipulate musical information in notation form. Music programming in the notation syntax provided by <code>tabr</code> can be used for a variety of purposes, but it also integrates cohesively with the package’s transcription functions.</p>
<div id="noteworthy-strings" class="section level2">
<h2 class="hasAnchor">
<a href="#noteworthy-strings" class="anchor"></a>Noteworthy strings</h2>
<p>Before exploring many of the music programming functions in the package, it is worth introducing an important concept that is expressed throughout <code>tabr</code>: noteworthiness. Prior to construction of <code>phrase</code> class objects that can be passed to LilyPond for sheet music engraving, you start out with simple character strings. These strings contain letters representing musical notes, and possibly some other characters that indicate such things as sharps and flats, octave number, and rests.</p>
<p>There are a number of requirements strings must meet to have valid <code>tabr</code> music notation syntax that can be transformed meaningfully and unambiguously into LilyPond syntax. A string is considered <em>noteworthy</em> if it meets all of these requirements that differentiate it from arbitrary character strings.</p>
<p>It is important to be familiar with the requirements of a noteworthy string so that you can construct them properly. There is also the <code>noteworthy</code> class object built upon strings that have valid music notation syntax.</p>
<div id="checking-noteworthiness" class="section level3">
<h3 class="hasAnchor">
<a href="#checking-noteworthiness" class="anchor"></a>Checking noteworthiness</h3>
<p>A string can be checked directly with <code>noteworthy</code>.</p>
<div class="sourceCode" id="cb1"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span class="va">x</span> <span class="op"><-</span> <span class="st">"a, r b,*2 ce_g cd#g"</span>
<span class="fu"><a href="../reference/valid-notes.html">noteworthy</a></span><span class="op">(</span><span class="va">x</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> [1] TRUE
</code></pre>
<div class="sourceCode" id="cb2"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span class="fu"><a href="../reference/valid-notes.html">noteworthy</a></span><span class="op">(</span><span class="st">"h"</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> [1] FALSE
</code></pre>
<p>This reports whether the entire string conforms to all requirements for it to be valid <code>noteworthy</code> syntax.</p>
</div>
<div id="the-noteworthy-class" class="section level3">
<h3 class="hasAnchor">
<a href="#the-noteworthy-class" class="anchor"></a>The <code>noteworthy</code> class</h3>
<p>Functions in <code>tabr</code> that take noteworthy strings as input perform internal checks of noteworthiness for you and will throw an error if you provide an unworthy string. These checks are skipped if the input already has the <code>noteworthy</code> class. If a function returns a noteworthy string, the class will also be <code>noteworthy</code>.</p>
<p>It is important to understand that the notion of noteworthy strings is implemented throughout <code>tabr</code>. One purpose is thorough and strict input validation. This leads to more robust function behavior and consistent user programming experience by rejecting problematic string input early.</p>
<p><code>as_noteworthy</code> can be used to coerce to the <code>noteworthy</code> class. Coercion will fail if the string is not noteworthy. The class offers its own <code>print</code> and <code>summary</code> methods for noteworthy strings as well as a number of other generic method implementations. While some functions are intended to aggressively interpret a character string as noteworthy, performing the check and coercion directly, many functions in the package require an explicit <code>noteworthy</code> object. This is especially true of any generics, which dispatch methods based on the class of the input object.</p>
<p>Functions like <code>as_noteworthy</code> have the added benefit of conforming all notes to the same formatting. This will clean up any presence of combined flats and sharps and combined tick and integer octave numbering.</p>
<div class="sourceCode" id="cb3"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span class="va">x</span> <span class="op"><-</span> <span class="st">"a# b_*2 c, d'' e3*2 g_4 c2e_2g2*2"</span>
<span class="va">x</span> <span class="op"><-</span> <span class="fu"><a href="../reference/valid-notes.html">as_noteworthy</a></span><span class="op">(</span><span class="va">x</span><span class="op">)</span>
<span class="va">x</span></code></pre></div>
<pre class="r-output"><code>#> <span style="color: #555555;font-weight: bold;"><Noteworthy string>
#> Format: </span><span>space-delimited time</span><span style="color: #555555;font-weight: bold;">
#> Values: </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span> </span><span style="color: #00BBBB;font-weight: bold;">d</span><span style="color: #00BBBB;">''</span><span> </span><span style="color: #00BBBB;font-weight: bold;">e</span><span> </span><span style="color: #00BBBB;font-weight: bold;">e</span><span> </span><span style="color: #00BBBB;font-weight: bold;">g_</span><span style="color: #00BBBB;">'</span><span> </span><span style="color: #BBBB00;"><</span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">e_</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">,</span><span style="color: #BBBB00;">></span><span> </span><span style="color: #BBBB00;"><</span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">e_</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">,</span><span style="color: #BBBB00;">></span><span>
</span></code></pre>
<div class="sourceCode" id="cb4"><pre class="downlit sourceCode r">
<code class="sourceCode R">
<span class="fu"><a href="https://rdrr.io/r/base/summary.html">summary</a></span><span class="op">(</span><span class="va">x</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> <span style="color: #555555;font-weight: bold;"><Noteworthy string>
#> Timesteps: </span><span>10 (8 notes, 2 chords)</span><span style="color: #555555;font-weight: bold;">
#> Octaves: </span><span>tick</span><span style="color: #555555;font-weight: bold;">
#> Accidentals: </span><span>flat</span><span style="color: #555555;font-weight: bold;">
#> Format: </span><span>space-delimited time</span><span style="color: #555555;font-weight: bold;">
#> Values: </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span> </span><span style="color: #00BBBB;font-weight: bold;">d</span><span style="color: #00BBBB;">''</span><span> </span><span style="color: #00BBBB;font-weight: bold;">e</span><span> </span><span style="color: #00BBBB;font-weight: bold;">e</span><span> </span><span style="color: #00BBBB;font-weight: bold;">g_</span><span style="color: #00BBBB;">'</span><span> </span><span style="color: #BBBB00;"><</span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">e_</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">,</span><span style="color: #BBBB00;">></span><span> </span><span style="color: #BBBB00;"><</span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">e_</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">,</span><span style="color: #BBBB00;">></span><span>
</span></code></pre>
<p>When coercing a noteworthy character string to one that has the <code>noteworthy</code> class, formatting is inferred from the <code>notes</code> input. Precedence is given to ticks for octave numbering and flats for accidentals. You can specify formatting attributes by providing explicit arguments. This is useful for coercing to another format.</p>
<div class="sourceCode" id="cb5"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span class="va">x</span> <span class="op"><-</span> <span class="fu"><a href="../reference/valid-notes.html">as_noteworthy</a></span><span class="op">(</span><span class="va">x</span>, format <span class="op">=</span> <span class="st">"vector"</span>, octaves <span class="op">=</span> <span class="st">"tick"</span>, accidentals <span class="op">=</span> <span class="st">"flat"</span><span class="op">)</span>
<span class="va">x</span></code></pre></div>
<pre class="r-output"><code>#> <span style="color: #555555;font-weight: bold;"><Noteworthy string>
#> Format: </span><span>vectorized time</span><span style="color: #555555;font-weight: bold;">
#> Values: </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span> </span><span style="color: #00BBBB;font-weight: bold;">d</span><span style="color: #00BBBB;">''</span><span> </span><span style="color: #00BBBB;font-weight: bold;">e</span><span> </span><span style="color: #00BBBB;font-weight: bold;">e</span><span> </span><span style="color: #00BBBB;font-weight: bold;">g_</span><span style="color: #00BBBB;">'</span><span> </span><span style="color: #BBBB00;"><</span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">e_</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">,</span><span style="color: #BBBB00;">></span><span> </span><span style="color: #BBBB00;"><</span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">e_</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">,</span><span style="color: #BBBB00;">></span><span>
</span></code></pre>
<div class="sourceCode" id="cb6"><pre class="downlit sourceCode r">
<code class="sourceCode R">
<span class="fu"><a href="https://rdrr.io/r/base/summary.html">summary</a></span><span class="op">(</span><span class="va">x</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> <span style="color: #555555;font-weight: bold;"><Noteworthy string>
#> Timesteps: </span><span>10 (8 notes, 2 chords)</span><span style="color: #555555;font-weight: bold;">
#> Octaves: </span><span>tick</span><span style="color: #555555;font-weight: bold;">
#> Accidentals: </span><span>flat</span><span style="color: #555555;font-weight: bold;">
#> Format: </span><span>vectorized time</span><span style="color: #555555;font-weight: bold;">
#> Values: </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">b_</span><span> </span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span> </span><span style="color: #00BBBB;font-weight: bold;">d</span><span style="color: #00BBBB;">''</span><span> </span><span style="color: #00BBBB;font-weight: bold;">e</span><span> </span><span style="color: #00BBBB;font-weight: bold;">e</span><span> </span><span style="color: #00BBBB;font-weight: bold;">g_</span><span style="color: #00BBBB;">'</span><span> </span><span style="color: #BBBB00;"><</span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">e_</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">,</span><span style="color: #BBBB00;">></span><span> </span><span style="color: #BBBB00;"><</span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">e_</span><span style="color: #00BBBB;">,</span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">,</span><span style="color: #BBBB00;">></span><span>
</span></code></pre>
<p>Some functions like <code>transpose</code> also expose these formatting arguments directly. For other functions, format is strictly inferred from the input notes, but you can always coerce to another format with <code>as_noteworthy</code>.</p>
<p>As an aside, tick octave notation is not the default just because it is used by LilyPond. The vignettes on transcription show that conversion from integers to ticks for the <code>phrase</code> objects used in transcription is automatic. Another reason to use the tick format regardless is that it is more robust. In <code>tabr</code>, integer octaves cannot go below zero without leading to problematic syntax, but you can always add more commas as octaves decrease. An even more critical reason is that the <code>music</code> class, which assembles a <code>noteworthy</code> class object and a <code>noteinfo</code> class object together, strictly uses tick format for octave numbering because numbers are needed to unambiguously describe time juxtaposed with octave numbering.</p>
</div>
<div id="stricter-note-and-chord-validation" class="section level3">
<h3 class="hasAnchor">
<a href="#stricter-note-and-chord-validation" class="anchor"></a>Stricter note and chord validation</h3>
<p><code>noteworthy</code> is built upon the more specific, vectorized functions <code>is_note</code> and <code>is_chord</code>, which provide more detailed information on the space-delimited entries in a string. <code>is_note</code> and <code>is_chord</code> return a logical vector reporting whether each entry contains a valid note or valid chord representation, respectively.</p>
<p>Notice how the vectorized results account for the expansion operator in <code>b2*2</code>.</p>
<div class="sourceCode" id="cb7"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span class="va">x</span> <span class="op"><-</span> <span class="st">"a2 r b2*2 ce_g cd#g HELLO_WORLD"</span>
<span class="fu"><a href="../reference/valid-notes.html">is_note</a></span><span class="op">(</span><span class="va">x</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> [1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE
</code></pre>
<div class="sourceCode" id="cb8"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span class="fu"><a href="../reference/valid-notes.html">is_chord</a></span><span class="op">(</span><span class="va">x</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> [1] FALSE FALSE FALSE FALSE TRUE TRUE FALSE
</code></pre>
<p>Functions like these serve simple purposes that you are unlikely to use them when writing sheet music. However, they can be highly useful in music data analysis, particularly when building more complex musical manipulations on top of simpler functions.</p>
</div>
</div>
<div id="notable-phrases" class="section level2">
<h2 class="hasAnchor">
<a href="#notable-phrases" class="anchor"></a>Notable phrases</h2>
<p>Before moving on, briefly consider the quasi-counterpart to noteworthy strings: notable phrases. If you have used <code>tabr</code>, you are familiar with turning strings into phrases, assembling these phrases into tracks and scores, and sending them on to LilyPond to create sheet music. In this context, you might think of phrase objects as the fundamental unit of musical information and the strings from which you create them seem more like raw data.</p>
<p><code>tabr</code> offers some ability to reverse direction and decompose phrases back into their component parts: <code>notes</code>, <code>info</code> and <code>string</code> character strings. This is done using <code>notify</code>, which returns a tibble data frame.</p>
<p>For complex phrases, this can be challenging. There should be no expectation of true one to one functional transformation. For example, <code>notify</code> is not complex enough to handle unfolding repeat sections or text notations attached to notes inside phrases. Certainly, this will not work for LilyPond syntax that was originally created in LilyPond rather than with <code>tabr</code> because <code>tabr</code> only provides access to a tiny fraction of what LilyPond can do. But in many simpler cases, you can successfully invert a phrase previously created from strings in R. Such a phrase is considered <em>notable</em>.</p>
<p><code>phrasey</code> can be used to check if a string at least loosely resembles the content of a valid phrase object. Additional related functions are shown below, which takes a phrase through a complete cycle of deconstruction and reconstruction.</p>
<div class="sourceCode" id="cb9"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span class="va">p1</span> <span class="op"><-</span> <span class="fu"><a href="../reference/phrase.html">phrase</a></span><span class="op">(</span><span class="st">"b, c d ec'g'~ ec'g'"</span>, <span class="st">"4( 4)- 2*3"</span>, <span class="st">"5*3 432*2"</span><span class="op">)</span>
<span class="va">p1</span></code></pre></div>
<pre class="r-output"><code>#> <span style="color: #555555;"><</span><span style="color: #555555;font-weight: bold;">Musical phrase</span><span style="color: #555555;">></span><span>
#> </span><span style="color: #555555;"><</span><span style="color: #00BBBB;font-weight: bold;">b</span><span style="color: #00BBBB;">,</span><span style="color: #BB0000;">\5</span><span style="color: #555555;">></span><span style="color: #BBBB00;">4(</span><span style="color: #555555;"> <</span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #BB0000;">\5</span><span style="color: #555555;">></span><span style="color: #BBBB00;">4)\glissando</span><span style="color: #555555;"> <</span><span style="color: #00BBBB;font-weight: bold;">d</span><span style="color: #BB0000;">\5</span><span style="color: #555555;">></span><span style="color: #BBBB00;">2</span><span style="color: #555555;"> <</span><span style="color: #00BBBB;font-weight: bold;">e</span><span style="color: #BBBB00;">~</span><span style="color: #BB0000;">\4</span><span style="color: #555555;"> </span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">'</span><span style="color: #BBBB00;">~</span><span style="color: #BB0000;">\3</span><span style="color: #555555;"> </span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">'</span><span style="color: #BBBB00;">~</span><span style="color: #BB0000;">\2</span><span style="color: #555555;">></span><span style="color: #BBBB00;">2</span><span style="color: #555555;"> <</span><span style="color: #00BBBB;font-weight: bold;">e</span><span style="color: #BB0000;">\4</span><span style="color: #555555;"> </span><span style="color: #00BBBB;font-weight: bold;">c</span><span style="color: #00BBBB;">'</span><span style="color: #BB0000;">\3</span><span style="color: #555555;"> </span><span style="color: #00BBBB;font-weight: bold;">g</span><span style="color: #00BBBB;">'</span><span style="color: #BB0000;">\2</span><span style="color: #555555;">></span><span style="color: #BBBB00;">2</span><span>
</span></code></pre>
<div class="sourceCode" id="cb10"><pre class="downlit sourceCode r">
<code class="sourceCode R">
<span class="va">x</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/character.html">as.character</a></span><span class="op">(</span><span class="va">p1</span><span class="op">)</span>
<span class="fu"><a href="../reference/phrase-checks.html">phrasey</a></span><span class="op">(</span><span class="va">x</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> [1] TRUE
</code></pre>
<div class="sourceCode" id="cb11"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span class="fu"><a href="https://rdrr.io/r/base/identical.html">identical</a></span><span class="op">(</span><span class="fu"><a href="../reference/phrase-checks.html">as_phrase</a></span><span class="op">(</span><span class="va">x</span><span class="op">)</span>, <span class="va">p1</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> [1] TRUE
</code></pre>
<div class="sourceCode" id="cb12"><pre class="downlit sourceCode r">
<code class="sourceCode R">
<span class="fu"><a href="../reference/phrase-checks.html">notable</a></span><span class="op">(</span><span class="va">p1</span><span class="op">)</span> <span class="co"># safe logical check</span></code></pre></div>
<pre class="r-output"><code>#> [1] TRUE
</code></pre>
<div class="sourceCode" id="cb13"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span class="fu"><a href="../reference/phrase-checks.html">notify</a></span><span class="op">(</span><span class="va">p1</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> <span style="color: #555555;"># A tibble: 5 x 3</span><span>
#> notes info string
#> </span><span style="color: #555555;font-style: italic;"><chr></span><span> </span><span style="color: #555555;font-style: italic;"><chr></span><span> </span><span style="color: #555555;font-style: italic;"><chr></span><span>
#> </span><span style="color: #555555;">1</span><span> b, 4( 5
#> </span><span style="color: #555555;">2</span><span> c 4)- 5
#> </span><span style="color: #555555;">3</span><span> d 2 5
#> </span><span style="color: #555555;">4</span><span> e~c'~g'~ 2 432
#> </span><span style="color: #555555;">5</span><span> ec'g' 2 432
</span></code></pre>
<div class="sourceCode" id="cb14"><pre class="downlit sourceCode r">
<code class="sourceCode R">
<span class="va">p2</span> <span class="op"><-</span> <span class="fu"><a href="../reference/phrase.html">p</a></span><span class="op">(</span><span class="fu"><a href="../reference/phrase-checks.html">phrase_notes</a></span><span class="op">(</span><span class="va">p1</span><span class="op">)</span>, <span class="fu"><a href="../reference/phrase-checks.html">phrase_info</a></span><span class="op">(</span><span class="va">p1</span><span class="op">)</span>, <span class="fu"><a href="../reference/phrase-checks.html">phrase_strings</a></span><span class="op">(</span><span class="va">p1</span><span class="op">)</span><span class="op">)</span>
<span class="fu"><a href="https://rdrr.io/r/base/identical.html">identical</a></span><span class="op">(</span><span class="va">p1</span>, <span class="va">p2</span><span class="op">)</span></code></pre></div>
<pre class="r-output"><code>#> [1] TRUE
</code></pre>
<p>With an understanding noteworthy strings, the next section covers a number of functions related to programming around musical scales.</p>
</div>
</div>
<div class="col-md-3 hidden-xs hidden-sm" id="pkgdown-sidebar">
<nav id="toc" data-toggle="toc"><h2 data-toc-skip>Contents</h2>
</nav>
</div>
</div>
<footer><div class="copyright">
<p>Developed by <a href="https://github.com/leonawicz">Matthew Leonawicz</a>.</p>
</div>
<div class="pkgdown">
<p>Site built with <a href="https://pkgdown.r-lib.org/">pkgdown</a> 1.6.1.</p>
</div>
</footer>
</div>
</body>
</html>