Skip to content

Commit d88ac05

Browse files
author
Salma Alam-Naylor
committed
Allow scale map component to receive a modeMap object so playback service can use this to construct an audio scale
1 parent cf96d35 commit d88ac05

14 files changed

+602
-374
lines changed

apps/fretonator-web/src/app/common/fret-map/fret-map.service.testConstants.ts

Lines changed: 115 additions & 0 deletions
Large diffs are not rendered by default.

apps/fretonator-web/src/app/common/fret-map/fret-map.service.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,10 @@ export class FretMapService {
8888
}
8989
} else {
9090
return noteName === 'g'
91-
? 'a'
92-
: Octave[Octave.indexOf(noteName) + 1];
91+
? 'a'
92+
: Octave[Octave.indexOf(noteName) + 1];
9393
}
94-
}
94+
};
9595

9696
generateNextNote = (currentNote: NoteObject, interval: number): NoteObject => {
9797
const nextNote = {
@@ -243,16 +243,22 @@ export class FretMapService {
243243
};
244244

245245
generateMode = (startingNote: NoteObject, mode: string): ModeMap => {
246-
let currentNote = startingNote;
247-
let newNote;
246+
let currentNote = {
247+
...startingNote,
248+
displayName: this.convertNoteObjectToHumanReadable(startingNote)
249+
};
248250

249251
const newMode: ModeMap = [];
250252
newMode.push(currentNote);
251253

254+
let newNote;
255+
252256
const modePattern = ModePatterns[mode];
253257

254258
for (let i = 0; i < modePattern.length - 1; i++) {
255259
newNote = this.generateNextNote(currentNote, modePattern[i]);
260+
newNote.displayName = this.convertNoteObjectToHumanReadable(newNote)
261+
256262
newMode.push(newNote);
257263
currentNote = newNote;
258264
}

apps/fretonator-web/src/app/common/fretonator/fretonator.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ <h4 class="fretonator__playCta">
6363

6464
<div class="infoContainer">
6565
<app-scale-map [mode]="mode"
66-
[scale]="scale"
66+
[modeMap]="modeMap"
6767
[isTheoretical]="scale | isTheoreticalScale"
6868
[modeDisplayString]="modeDisplayString"
6969
[note]="note"

apps/fretonator-web/src/app/common/fretonator/fretonator.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component, Input } from '@angular/core';
2-
import { ChordMap, FretMap, Mode, Scale } from '../../util/types';
2+
import { ChordMap, FretMap, Mode, ModeMap, Scale } from '../../util/types';
33
import { NotePlaybackService } from '../playback/note-playback.service';
44

55
@Component({
@@ -9,6 +9,7 @@ import { NotePlaybackService } from '../playback/note-playback.service';
99
})
1010
export class FretonatorComponent {
1111
@Input() fretMap: FretMap;
12+
@Input() modeMap: ModeMap;
1213
@Input() scale: Scale;
1314
@Input() intervalMap: [];
1415
@Input() chordMap: ChordMap;

apps/fretonator-web/src/app/common/fretonator/scale-map/scale-map.component.html

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
<h4 class="scaleDisplay__title"
44
[class.infoHighlight]="isTheoretical"><span *ngIf="isTheoretical">Theoretical &nbsp;</span>Scale</h4>
55
<div class="scaleDisplay__notes">
6-
<ng-container *ngFor="let scaleNote of scale; let i = index">
6+
<ng-container *ngFor="let note of modeMap; let i = index">
77
<h5 class="scaleDisplay__note">
8-
{{ scaleNote }}
9-
<span *ngIf="i < scale.length - 1"> - </span>
8+
{{ note.displayName }}
109
</h5>
1110
</ng-container>
1211
</div>

apps/fretonator-web/src/app/common/fretonator/scale-map/scale-map.component.scss

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
justify-content: center;
8585
align-items: center;
8686
margin-bottom: pxToRem($grid-unit * 8);
87+
width: 100%;
8788

8889
@media screen and (min-width: $screen-med) {
8990
flex-basis: 70%;
@@ -98,11 +99,29 @@
9899
flex-direction: row;
99100
}
100101

102+
.scaleDisplay__notes {
103+
display: flex;
104+
justify-content: space-between;
105+
align-items: center;
106+
}
107+
101108
.scaleDisplay__note {
102-
display: inline;
103-
font-size: pxToRem(24);
109+
display: inline-block;
110+
text-align: center;
111+
font-size: pxToRem(18);
104112
font-family: var(--font-family-main);
105113
font-weight: var(--font-weight-bold);
114+
margin: 0 pxToRem($grid-unit);
115+
116+
@media screen and (min-width: $screen-sm) {
117+
font-size: pxToRem(24);
118+
}
119+
120+
@media screen and (min-width: $screen-med) {
121+
&:first-of-type {
122+
margin-left: 0;
123+
}
124+
}
106125
}
107126

108127

apps/fretonator-web/src/app/common/fretonator/scale-map/scale-map.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component, Input } from '@angular/core';
2-
import { Mode, Scale } from '../../../util/types';
2+
import { Mode, ModeMap, Scale } from '../../../util/types';
33

44
enum ScaleDegreesToggleText {
55
hidden = 'What is this?',
@@ -20,6 +20,7 @@ export class ScaleMapComponent {
2020
@Input() mode: Mode;
2121
@Input() note: string;
2222
@Input() noteExtenderString: string;
23+
@Input() modeMap: ModeMap;
2324
@Input() scale: Scale;
2425
@Input() isTheoretical: boolean;
2526
@Input() modeDisplayString: string;

apps/fretonator-web/src/app/pages/home/home-index/__snapshots__/home-index.component.spec.ts.snap

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,67 +1069,42 @@ exports[`HomeIndexComponent should create 1`] = `
10691069
class="scaleDisplay__note"
10701070
>
10711071
C
1072-
1073-
<span>
1074-
-
1075-
</span>
10761072
</h5>
10771073
10781074
<h5
10791075
class="scaleDisplay__note"
10801076
>
10811077
D
1082-
1083-
<span>
1084-
-
1085-
</span>
10861078
</h5>
10871079
10881080
<h5
10891081
class="scaleDisplay__note"
10901082
>
10911083
E
1092-
1093-
<span>
1094-
-
1095-
</span>
10961084
</h5>
10971085
10981086
<h5
10991087
class="scaleDisplay__note"
11001088
>
11011089
F
1102-
1103-
<span>
1104-
-
1105-
</span>
11061090
</h5>
11071091
11081092
<h5
11091093
class="scaleDisplay__note"
11101094
>
11111095
G
1112-
1113-
<span>
1114-
-
1115-
</span>
11161096
</h5>
11171097
11181098
<h5
11191099
class="scaleDisplay__note"
11201100
>
11211101
A
1122-
1123-
<span>
1124-
-
1125-
</span>
11261102
</h5>
11271103
11281104
<h5
11291105
class="scaleDisplay__note"
11301106
>
11311107
B
1132-
11331108
</h5>
11341109
</div>
11351110
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { TestBed } from '@angular/core/testing';
2+
3+
import { GenerateModeMapPipe } from './generate-mode-map.pipe';
4+
import { Mode, ModeMap } from '../../../util/types';
5+
import { FretMapService } from '../../../common/fret-map/fret-map.service';
6+
import { GenerateFretMapPipe } from './generate-fret-map.pipe';
7+
8+
describe('GenerateModeMapPipe', () => {
9+
let pipe: GenerateModeMapPipe;
10+
11+
beforeEach(() => {
12+
const service = TestBed.inject(FretMapService);
13+
pipe = new GenerateModeMapPipe(service);
14+
});
15+
16+
it('create an instance', () => {
17+
expect(pipe).toBeTruthy();
18+
});
19+
20+
21+
it('calls GenerateFretMapService.generateMode', () => {
22+
const spy = spyOn(pipe.generateFretMapService, 'generateMode');
23+
24+
const note = {
25+
name: 'c',
26+
flat: false,
27+
sharp: false,
28+
doubleFlat: false,
29+
doubleSharp: false,
30+
};
31+
32+
pipe.transform(note, 'ionian' as Mode);
33+
expect(spy).toHaveBeenCalledWith(note, 'ionian');
34+
});
35+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Pipe, PipeTransform } from '@angular/core';
2+
import { FretMap, Mode, ModeMap, NoteObject } from '../../../util/types';
3+
import { FretMapService } from '../../../common/fret-map/fret-map.service';
4+
5+
@Pipe({
6+
name: 'generateModeMap'
7+
})
8+
export class GenerateModeMapPipe implements PipeTransform {
9+
constructor(public generateFretMapService: FretMapService) {}
10+
11+
transform(note: NoteObject, mode: Mode): ModeMap {
12+
return this.generateFretMapService.generateMode(note, mode);
13+
}
14+
15+
}

0 commit comments

Comments
 (0)