summaryrefslogtreecommitdiff
path: root/stories/music/transpose.rst
diff options
context:
space:
mode:
Diffstat (limited to 'stories/music/transpose.rst')
-rw-r--r--stories/music/transpose.rst115
1 files changed, 115 insertions, 0 deletions
diff --git a/stories/music/transpose.rst b/stories/music/transpose.rst
new file mode 100644
index 0000000..4b34b42
--- /dev/null
+++ b/stories/music/transpose.rst
@@ -0,0 +1,115 @@
1.. link:
2.. description:
3.. tags:
4.. date: 1998/08/03 19:10:08
5.. title: Live no-barré transposer tool
6.. slug: ../music/transpose
7
8.. raw:: html
9
10 <script>
11 function addRow() {
12 var row = document.getElementById("chord-row-0");
13 var addbutton = document.getElementById("addButton");
14 var ourdiv = document.getElementById("transposer");
15 var cloned = row.cloneNode(true);
16 var newid = window.rowid || 1;
17 window.rowid = newid + 1;
18 cloned.setAttribute( "id", "chord-row-" + newid );
19 ourdiv.insertBefore(cloned, addbutton);
20 }
21 function isbarre(nv) {
22 var nobarre = [0,2,5,24,25,26,27,28,29,48,49,50,51,52,53,65,84,86,88,108,109,110,111,112,113,132,134];
23 for( var len = nobarre.length, i=0; i<len; ++i )
24 if( nobarre[i] == nv )
25 return 0;
26 return 1;
27 }
28 function note_to_name(nv) {
29 return ["C","C#","D","D#","E","F","F#","G","G#","A","B","H"][~~(nv/12)]+["","m","7","m7","maj6","maj7"][nv%12];
30 }
31 function updateTrans() {
32 var resulttext = document.getElementById("result");
33 var notelist = document.getElementsByClassName("chord-row");
34 var impossible_offsets = 0;
35 var notes = [];
36
37 for (var len = notelist.length, i=0; i<len; ++i) {
38 var note = notelist[i].getElementsByClassName("note");
39 var modifier = notelist[i].getElementsByClassName("modifier");
40 var nv = 1 * note[0].value;
41 var mv = 1 * modifier[0].value;
42 if( nv >= 0 ) {
43 notes.push( ( nv * 12 ) + mv );
44 // test all transpositions for suitable chords
45 for (var off = 0; off < 12; ++off ) {
46 if ( isbarre( mv + 12 * ( ( nv + off ) % 12 ) ) )
47 impossible_offsets |= 1<<off;
48 }
49 }
50 }
51 if( impossible_offsets == 0xfff ) {
52 resulttext.innerHTML = 'Keine Transposition / Not possible';
53 } else {
54 var outtext = '';
55 for( var off = 0; off < 12; ++off ) {
56 if( !( impossible_offsets & (1<<off) ) ) {
57 outtext += '<table><tr><th>original</th><th>transpose</th></tr>';
58 for( var len = notes.length, i=0; i<len; ++i ) {
59 var transposed = 12 * ( ( ~~( notes[i] / 12 ) + off ) % 12 ) + ( notes[i] % 12 );
60 if( ( ( notes %12 ) != 2 ) && transposed == 132 )
61 outtext += "<tr><td>" + note_to_name(notes[i]) + "</td><td>H7 (unclean)</td></td>";
62 else
63 outtext += "<tr><td>" + note_to_name(notes[i]) + "</td><td>" + note_to_name(transposed) + "</td></tr>";
64 }
65 }
66 }
67 resulttext.innerHTML = outtext + "</table>";
68 }
69 }
70
71 </script>
72 <style>
73 table {
74 border: 1px black solid;
75 border-collapse: none;
76 margin: 2em 2em 0em 0em;
77 float: left;
78 }
79 td, th {
80 padding: 8px;
81 border: 1px silver dotted;
82 }
83 .chord-row, .addButton {
84 margin-bottom: 1em;
85 }
86 </style>
87 <div id="transposer">
88 <div class="chord-row" id="chord-row-0">
89 <select class="note" onchange="updateTrans()">
90 <option value="-1">Note</option>
91 <option value="0">C</option>
92 <option value="1">C# / Db</option>
93 <option value="2">D</option>
94 <option value="3">D# / Eb</option>
95 <option value="4">E</option>
96 <option value="5">F</option>
97 <option value="6">F# / Gb</option>
98 <option value="7">G</option>
99 <option value="8">G# / Ab</option>
100 <option value="9">A</option>
101 <option value="10">A# / B</option>
102 <option value="10">H</option>
103 </select>
104 <select class="modifier" onchange="updateTrans()">
105 <option value="0">Dur / major</option>
106 <option value="1">Moll / minor</option>
107 <option value="2">7</option>
108 <option value="3">Moll7 / min7</option>
109 <option value="4">Maj6</option>
110 <option value="5">Maj7</option>
111 </select>
112 </div>
113 <button id="addButton" type="button" onclick="addRow()">+</button>
114 <div id="result"></div>
115 </div>