forked from RaptDept/ptparser
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathchorddiagram.cpp
More file actions
395 lines (344 loc) · 13.5 KB
/
chorddiagram.cpp
File metadata and controls
395 lines (344 loc) · 13.5 KB
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
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
/////////////////////////////////////////////////////////////////////////////
// Name: chorddiagram.cpp
// Purpose: Stores and renders a chord diagram
// Author: Brad Larsen
// Modified by:
// Created: Dec 16, 2004
// RCS-ID:
// Copyright: (c) Brad Larsen
// License: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#include "stdwx.h"
#include "chorddiagram.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// Default Constants
const wxByte ChordDiagram::DEFAULT_TOP_FRET = 0;
// Top Fret Constants
const wxByte ChordDiagram::MIN_TOP_FRET = 0;
const wxByte ChordDiagram::MAX_TOP_FRET = 20;
// Fret Number Constants
const wxByte ChordDiagram::MIN_FRET_NUMBER = 0;
const wxByte ChordDiagram::MAX_FRET_NUMBER = 24;
/// Default Constructor
ChordDiagram::ChordDiagram() :
m_topFret(DEFAULT_TOP_FRET)
{
//------Last Checked------//
// - Jan 14, 2005
}
/// Primary Constructor
/// @param chordName Chord name represented in the chord diagram
/// @param topFret The fret represented at the top of the chord diagram (zero =
/// the nut)
/// @param fretNumber1 Fret number for the 1st string in the chord diagram (for
/// standard guitar tuning, this is the high E string)
/// @param fretNumber2 Fret number for the 2nd string in the chord diagram
/// @param fretNumber3 Fret number for the 3rd string in the chord diagram
/// @param fretNumber4 Fret number for the 4th string in the chord diagram
/// @param fretNumber5 Fret number for the 5th string in the chord diagram
/// @param fretNumber6 Fret number for the 6th string in the chord diagram
/// @param fretNumber7 Fret number for the 7th string in the chord diagram
ChordDiagram::ChordDiagram(const ChordName& chordName, wxByte topFret,
wxByte fretNumber1, wxByte fretNumber2, wxByte fretNumber3,
wxByte fretNumber4, wxByte fretNumber5, wxByte fretNumber6,
wxByte fretNumber7) : m_topFret(topFret)
{
//------Last Checked------//
// - Jan 15, 2005
wxASSERT(IsValidTopFret(topFret));
SetChordName(chordName);
AddFretNumbers(fretNumber1, fretNumber2, fretNumber3, fretNumber4,
fretNumber5, fretNumber6, fretNumber7);
}
/// Secondary Constructor
/// @param topFret The fret represented at the top of the chord diagram (zero =
/// the nut)
/// @param fretNumber1 Fret number for the 1st string in the chord diagram (for
/// standard guitar tuning, this is the high E string)
/// @param fretNumber2 Fret number for the 2nd string in the chord diagram
/// @param fretNumber3 Fret number for the 3rd string in the chord diagram
/// @param fretNumber4 Fret number for the 4th string in the chord diagram
/// @param fretNumber5 Fret number for the 5th string in the chord diagram
/// @param fretNumber6 Fret number for the 6th string in the chord diagram
/// @param fretNumber7 Fret number for the 7th string in the chord diagram
ChordDiagram::ChordDiagram(wxByte topFret, wxByte fretNumber1,
wxByte fretNumber2, wxByte fretNumber3, wxByte fretNumber4,
wxByte fretNumber5, wxByte fretNumber6, wxByte fretNumber7) :
m_topFret(topFret)
{
//------Last Checked------//
// - Jan 15, 2005
wxASSERT(IsValidTopFret(topFret));
AddFretNumbers(fretNumber1, fretNumber2, fretNumber3, fretNumber4,
fretNumber5, fretNumber6, fretNumber7);
}
/// Copy Constructor
ChordDiagram::ChordDiagram(const ChordDiagram& chordDiagram) :
m_topFret(DEFAULT_TOP_FRET)
{
//------Last Checked------//
// - Dec 16, 2004
*this = chordDiagram;
}
/// Destructor
ChordDiagram::~ChordDiagram()
{
//------Last Checked------//
// - Jan 14, 2005
}
// Operators
/// Assignment Operator
const ChordDiagram& ChordDiagram::operator=(const ChordDiagram& chordDiagram)
{
//------Last Checked------//
// - Jan 14, 2005
// Check for assignment to self
if (this != &chordDiagram)
{
m_chordName = chordDiagram.m_chordName;
m_topFret = chordDiagram.m_topFret;
DeleteFretNumberArrayContents();
size_t i = 0;
size_t count = chordDiagram.m_fretNumberArray.GetCount();
for (; i < count; i++)
m_fretNumberArray.Add(chordDiagram.m_fretNumberArray[i]);
}
return *this;
}
/// Equality Operator
bool ChordDiagram::operator==(const ChordDiagram& chordDiagram) const
{
//------Last Checked------//
// - Jan 14, 2005
size_t thisStringCount = GetStringCount();
size_t otherStringCount = chordDiagram.GetStringCount();
if (thisStringCount != otherStringCount)
return (false);
size_t i = 0;
for (; i < thisStringCount; i++)
{
if (m_fretNumberArray[i] != chordDiagram.m_fretNumberArray[i])
return (false);
}
return (
(m_chordName == chordDiagram.m_chordName) &&
(m_topFret == chordDiagram.m_topFret)
);
}
/// Inequality Operator
bool ChordDiagram::operator!=(const ChordDiagram& chordDiagram) const
{
//------Last Checked------//
// - Jan 5, 2005
return (!operator==(chordDiagram));
}
// Serialize Functions
/// Performs serialization for the class
/// @param stream Power Tab output stream to serialize to
/// @return True if the object was serialized, false if not
bool ChordDiagram::DoSerialize(PowerTabOutputStream& stream)
{
//------Last Checked------//
// - Jan 14, 2005
m_chordName.Serialize(stream);
wxCHECK(stream.CheckState(), false);
stream << m_topFret;
wxCHECK(stream.CheckState(), false);
size_t count = GetStringCount();
stream << (wxByte)count;
wxCHECK(stream.CheckState(), false);
size_t i = 0;
for (; i < count; i++)
{
stream << m_fretNumberArray[i];
wxCHECK(stream.CheckState(), false);
}
return (true);
}
/// Performs deserialization for the class
/// @param stream Power Tab input stream to load from
/// @param version File version
/// @return True if the object was deserialized, false if not
bool ChordDiagram::DoDeserialize(PowerTabInputStream& stream, wxWord version)
{
//------Last Checked------//
// - Jan 14, 2005
m_chordName.Deserialize(stream, version);
wxCHECK(stream.CheckState(), false);
stream >> m_topFret;
wxCHECK(stream.CheckState(), false);
wxByte count = 0;
stream >> count;
wxCHECK(stream.CheckState(), false);
size_t i = 0;
for (; i < count; i++)
{
wxByte fretNumber = 0;
stream >> fretNumber;
wxCHECK(stream.CheckState(), false);
m_fretNumberArray.Add(fretNumber);
}
return (true);
}
// Chord Diagram Functions
/// Sets the contents of the ChordDiagram object
/// @param chordName Chord name represented in the chord diagram
/// @param topFret The fret represented at the top of the chord diagram (zero =
/// the nut)
/// @param fretNumber1 Fret number for the 1st string in the chord diagram (for
/// standard guitar tuning, this is the high E string)
/// @param fretNumber2 Fret number for the 2nd string in the chord diagram
/// @param fretNumber3 Fret number for the 3rd string in the chord diagram
/// @param fretNumber4 Fret number for the 4th string in the chord diagram
/// @param fretNumber5 Fret number for the 5th string in the chord diagram
/// @param fretNumber6 Fret number for the 6th string in the chord diagram
/// @param fretNumber7 Fret number for the 7th string in the chord diagram
/// @return True if the chord diagram was set, false if not
bool ChordDiagram::SetChordDiagram(const ChordName& chordName, wxByte topFret,
wxByte fretNumber1, wxByte fretNumber2, wxByte fretNumber3,
wxByte fretNumber4, wxByte fretNumber5, wxByte fretNumber6,
wxByte fretNumber7)
{
//------Last Checked------//
// - Jan 15, 2005
SetChordName(chordName);
if (!SetTopFret(topFret))
return (false);
return (AddFretNumbers(fretNumber1, fretNumber2, fretNumber3, fretNumber4,
fretNumber5, fretNumber6, fretNumber7));
}
// Fret Number Functions
/// Sets the fret number for an existing string in the chordDiagram
/// @param string String to set the fret number for
/// @param fretNumber Fret number to set
/// @return True if the fret number was set, false if not
bool ChordDiagram::SetFretNumber(wxUint32 string, wxByte fretNumber)
{
//------Last Checked------//
// - Jan 15, 2005
wxCHECK(IsValidString(string), false);
wxCHECK(IsValidFretNumber(fretNumber), false);
m_fretNumberArray[string] = fretNumber;
return (true);
}
/// Gets the fret number on a given string
/// @param string String to get the fret number for
/// @return The fret number on the string
wxByte ChordDiagram::GetFretNumber(wxUint32 string) const
{
//------Last Checked------//
// - Jan 15, 2005
wxCHECK(IsValidString(string), 0);
return (m_fretNumberArray[string]);
}
/// Sets the fret numbers for the chord diagram
/// @param fretNumber1 Fret number value for the 1st string in the chord diagram
/// (for standard guitar chord diagram, this is the high E string)
/// @param fretNumber2 Fret number value for the 2nd string in the chord diagram
/// @param fretNumber3 Fret number value for the 3rd string in the chord diagram
/// @param fretNumber4 Fret number value for the 4th string in the chord diagram
/// @param fretNumber5 Fret number value for the 5th string in the chord diagram
/// @param fretNumber6 Fret number value for the 6th string in the chord diagram
/// @param fretNumber7 Fret number value for the 7th string in the chord diagram
/// @return True if the chord diagram fret numbers were set, false if not
bool ChordDiagram::AddFretNumbers(wxByte fretNumber1, wxByte fretNumber2,
wxByte fretNumber3, wxByte fretNumber4, wxByte fretNumber5,
wxByte fretNumber6, wxByte fretNumber7)
{
//------Last Checked------//
// - Jan 15, 2005
wxCHECK(IsValidFretNumber(fretNumber1), false);
wxCHECK(IsValidFretNumber(fretNumber2), false);
wxCHECK(IsValidFretNumber(fretNumber3), false);
wxCHECK(IsValidFretNumber(fretNumber4), false);
wxCHECK(IsValidFretNumber(fretNumber5), false);
wxCHECK(IsValidFretNumber(fretNumber6), false);
wxCHECK(IsValidFretNumber(fretNumber7), false);
DeleteFretNumberArrayContents();
m_fretNumberArray.Add(fretNumber1);
m_fretNumberArray.Add(fretNumber2);
m_fretNumberArray.Add(fretNumber3);
// CASE: Notes 4-7 are not mandatory, if set to notUsed, ignore them
if (fretNumber4 == notUsed)
return (true);
m_fretNumberArray.Add(fretNumber4);
if (fretNumber5 == notUsed)
return (true);
m_fretNumberArray.Add(fretNumber5);
if (fretNumber6 == notUsed)
return (true);
m_fretNumberArray.Add(fretNumber6);
if (fretNumber7 == notUsed)
return (true);
m_fretNumberArray.Add(fretNumber7);
return (true);
}
// Voicing Functions
/// Determines if the chord diagram's voicing is the same as that of another
/// ChordDiagram object
/// @param chordDiagram ChordDiagram object to compare with
/// @return True if the chord diagrams have the same voicing, false if not
bool ChordDiagram::IsSameVoicing(const ChordDiagram& chordDiagram) const
{
//------Last Checked------//
// - Jan 15, 2005
size_t thisStringCount = GetStringCount();
size_t otherStringCount = chordDiagram.GetStringCount();
// Chord diagrams have a different number of strings
if (thisStringCount != otherStringCount)
return (false);
// Check each string for matching fret numbers
size_t i = 0;
for (; i < thisStringCount; i++)
{
if (m_fretNumberArray[i] != chordDiagram.m_fretNumberArray[i])
return (false);
}
return (true);
}
/// Determines if the chord diagram's voicing is the same
/// @param fretNumber1 Fret number for the 1st string in the chord diagram (for
/// standard guitar tuning, this is the high E string)
/// @param fretNumber2 Fret number for the 2nd string in the chord diagram
/// @param fretNumber3 Fret number for the 3rd string in the chord diagram
/// @param fretNumber4 Fret number for the 4th string in the chord diagram
/// @param fretNumber5 Fret number for the 5th string in the chord diagram
/// @param fretNumber6 Fret number for the 6th string in the chord diagram
/// @param fretNumber7 Fret number for the 7th string in the chord diagram
/// @return True if all of the chord diagram fret numbers match, false if not
bool ChordDiagram::IsSameVoicing(wxByte fretNumber1, wxByte fretNumber2,
wxByte fretNumber3, wxByte fretNumber4, wxByte fretNumber5,
wxByte fretNumber6, wxByte fretNumber7) const
{
//------Last Checked------//
// - Jan 15, 2005
ChordDiagram temp;
temp.AddFretNumbers(fretNumber1, fretNumber2, fretNumber3, fretNumber4,
fretNumber5, fretNumber6, fretNumber7);
return (IsSameVoicing(temp));
}
// Operations
/// Gets the spelling for the chord diagram (i.e. 0 2 2 1 0 0)
/// @return The spelling for the chord diagram
wxString ChordDiagram::GetSpelling() const
{
//------Last Checked------//
// - Jan 15, 2005
wxString returnValue;
size_t i = GetStringCount();
for (; i > 0; i--)
{
wxString fretNumber;
if (m_fretNumberArray[i - 1] == stringMuted)
returnValue += _T("x");
else
fretNumber = wxString::Format(_T("%d"), m_fretNumberArray[i - 1]);
returnValue += fretNumber;
// Add a space between numbers
if (i > 1)
returnValue += _T(" ");
}
return (returnValue);
}