module resolution problem
This commit is contained in:
2
app.ts
2
app.ts
@@ -1,6 +1,4 @@
|
|||||||
import * as Tone from 'tone';
|
import * as Tone from 'tone';
|
||||||
import { pitchsets } from "./src/toneGeneration.js";
|
|
||||||
import { extractPitchset } from './src/harmonyUtil.js';
|
|
||||||
|
|
||||||
// initialize four synth voices
|
// initialize four synth voices
|
||||||
const soprano = new Tone.Synth().toDestination();
|
const soprano = new Tone.Synth().toDestination();
|
||||||
|
|||||||
@@ -119,10 +119,5 @@
|
|||||||
<script type="module" src="https://unpkg.com/tone@14.7.77/build/Tone.js"></script>
|
<script type="module" src="https://unpkg.com/tone@14.7.77/build/Tone.js"></script>
|
||||||
<!-- internal scripts -->
|
<!-- internal scripts -->
|
||||||
<script type="module" src="./built/app.js"></script>
|
<script type="module" src="./built/app.js"></script>
|
||||||
<script type="module" src="./built/src/toneGeneration.js"></script>
|
|
||||||
<script type="module" src="./built/src/harmonyUtil.js"></script>
|
|
||||||
<script type="module" src="./built/src/inputHandling.js"></script>
|
|
||||||
<script type="module" src="./built/src/styleUtils.js"></script>
|
|
||||||
<script type="module" src="./built/src/audioUtils.js"></script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
15
package-lock.json
generated
15
package-lock.json
generated
@@ -11,6 +11,9 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tone": "^14.7.77",
|
"tone": "^14.7.77",
|
||||||
"typescript": "^4.6.4"
|
"typescript": "^4.6.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^17.0.32"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/runtime": {
|
"node_modules/@babel/runtime": {
|
||||||
@@ -24,6 +27,12 @@
|
|||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/node": {
|
||||||
|
"version": "17.0.32",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.32.tgz",
|
||||||
|
"integrity": "sha512-eAIcfAvhf/BkHcf4pkLJ7ECpBAhh9kcxRBpip9cTiO+hf+aJrsxYxBeS6OXvOd9WqNAJmavXVpZvY1rBjNsXmw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/automation-events": {
|
"node_modules/automation-events": {
|
||||||
"version": "4.0.16",
|
"version": "4.0.16",
|
||||||
"resolved": "https://registry.npmjs.org/automation-events/-/automation-events-4.0.16.tgz",
|
"resolved": "https://registry.npmjs.org/automation-events/-/automation-events-4.0.16.tgz",
|
||||||
@@ -87,6 +96,12 @@
|
|||||||
"regenerator-runtime": "^0.13.4"
|
"regenerator-runtime": "^0.13.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/node": {
|
||||||
|
"version": "17.0.32",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.32.tgz",
|
||||||
|
"integrity": "sha512-eAIcfAvhf/BkHcf4pkLJ7ECpBAhh9kcxRBpip9cTiO+hf+aJrsxYxBeS6OXvOd9WqNAJmavXVpZvY1rBjNsXmw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"automation-events": {
|
"automation-events": {
|
||||||
"version": "4.0.16",
|
"version": "4.0.16",
|
||||||
"resolved": "https://registry.npmjs.org/automation-events/-/automation-events-4.0.16.tgz",
|
"resolved": "https://registry.npmjs.org/automation-events/-/automation-events-4.0.16.tgz",
|
||||||
|
|||||||
@@ -14,5 +14,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tone": "^14.7.77",
|
"tone": "^14.7.77",
|
||||||
"typescript": "^4.6.4"
|
"typescript": "^4.6.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^17.0.32"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
import { evaluateVector, pitchsets } from "./toneGeneration";
|
import { soundChord } from '../app.js';
|
||||||
import { extractPitchset, findVector } from "./harmonyUtil";
|
import { pitchsets } from "./harmonyUtil.js";
|
||||||
import { soundChord } from '../app';
|
|
||||||
|
import { evaluateVector } from "./vector_logic/evaluateVector.js";
|
||||||
|
import { findVector } from "./vector_logic/findVector.js";
|
||||||
|
import { extractPitchset } from "./vector_logic/extractPitchset.js";
|
||||||
|
|
||||||
export const fullRandomChord = () => {
|
export const fullRandomChord = () => {
|
||||||
let pitches: string[];
|
let pitches: string[];
|
||||||
|
|||||||
@@ -1,3 +1,14 @@
|
|||||||
|
// pitchset definitions, grouped into matrix before export
|
||||||
|
const sopranoTones = ["B5", "A5", "G5", "F#5", "F5", "E5", "D5", "C5", "B4", "Bb4", "A4", "G4", "F#4", "F4", "E4"];
|
||||||
|
const altoTones = ["E5", "D5", "C5", "B4", "Bb4", "A4", "G4", "F#4", "F4", "E4", "D4", "C4", "B3", "Bb3", "A3", "G3"];
|
||||||
|
const tenorTones = ["G4", "F#4", "F4", "E4", "D4", "C4", "B3", "Bb3", "A3", "G3", "F3", "E3", "D3", "C3"];
|
||||||
|
const bassTones = ["C2", "D2", "E2", "F2", "G2", "A2", "Bb2", "B2", "C3", "D3", "E3", "F3", "G3"];
|
||||||
|
|
||||||
|
export const pitchsets: string[][] = [sopranoTones, altoTones, tenorTones, bassTones];
|
||||||
|
|
||||||
|
// mapping of musical pitches, refer to this by index, maps onto base 12
|
||||||
|
export const musicalPitches = ['A', "Bb", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"];
|
||||||
|
|
||||||
// interval definitions:
|
// interval definitions:
|
||||||
export interface IntervalDef {
|
export interface IntervalDef {
|
||||||
number: string
|
number: string
|
||||||
@@ -14,8 +25,6 @@ export const IntervalDefNames = {
|
|||||||
// ... all intervals beyond this invert to one of the previous intervals
|
// ... all intervals beyond this invert to one of the previous intervals
|
||||||
}
|
}
|
||||||
|
|
||||||
export const musicalPitches = ['A', "Bb", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"];
|
|
||||||
|
|
||||||
// helper functions
|
// helper functions
|
||||||
const transposePitches = (pitches: number[], interval: number) => {
|
const transposePitches = (pitches: number[], interval: number) => {
|
||||||
let transposed = [];
|
let transposed = [];
|
||||||
@@ -23,55 +32,6 @@ const transposePitches = (pitches: number[], interval: number) => {
|
|||||||
return transposed;
|
return transposed;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const extractPitchset = (pitches: string[]) => {
|
|
||||||
// 1) determine pitch set from given array of pitches
|
|
||||||
let pitchset: number[] = [];
|
|
||||||
|
|
||||||
for (let each of pitches) {
|
|
||||||
// filters numbers from above tones
|
|
||||||
const str = each;
|
|
||||||
const regex = /[0-9]/g;
|
|
||||||
const withoutNums = str.replace(regex, '');
|
|
||||||
const pitchNumber = musicalPitches.indexOf(withoutNums);
|
|
||||||
|
|
||||||
// ... so that they may be mapped onto numbers corresponding to the chromatic scale
|
|
||||||
pitchset.push(pitchNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
// these are sorted from lowest to highest index (something like an interval vector)
|
|
||||||
pitchset.sort((a,b) => a - b);
|
|
||||||
return pitchset;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const findVector = (pitches: number[]) => {
|
|
||||||
let sorted = pitches.sort((x,y) => x - y);
|
|
||||||
// sorted = sorted.filter((num, idx) => {
|
|
||||||
// return sorted.indexOf(num) === idx;
|
|
||||||
// });
|
|
||||||
|
|
||||||
// finds each interval and logs it as a duple
|
|
||||||
let intervalClasses: number[] = [];
|
|
||||||
for (let i = 0; i < sorted.length; i++) {
|
|
||||||
let j = i+1;
|
|
||||||
|
|
||||||
// does not allow out of range values in the proceeding loop
|
|
||||||
if (j >= sorted.length) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
let thing: number = (sorted[j] - sorted[i]) % 6
|
|
||||||
if (!(intervalClasses.includes(thing))) {
|
|
||||||
intervalClasses.push(thing);
|
|
||||||
}
|
|
||||||
j++;
|
|
||||||
} while (j < sorted.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
intervalClasses = intervalClasses.sort((x,y) => x-y);
|
|
||||||
return intervalClasses;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const labelIntervals = (vector: number[]): [number, IntervalDef][] => {
|
export const labelIntervals = (vector: number[]): [number, IntervalDef][] => {
|
||||||
let result: [number, IntervalDef][] = [];
|
let result: [number, IntervalDef][] = [];
|
||||||
|
|
||||||
@@ -82,12 +42,6 @@ export const labelIntervals = (vector: number[]): [number, IntervalDef][] => {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// analysis
|
|
||||||
let dMajor = extractPitchset(["D", "F#", "A", "D"]);
|
|
||||||
const eMajor = transposePitches(dMajor, 2);
|
|
||||||
console.log(eMajor);
|
|
||||||
console.log('');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sample uses of these functions detailed below:
|
* sample uses of these functions detailed below:
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import * as Tone from "tone";
|
import * as Tone from 'tone';
|
||||||
|
|
||||||
export const startButton = document.getElementById("start-tone");
|
export const startButton = document.getElementById("start-tone");
|
||||||
export const synthButton = document.getElementById("synth-button");
|
export const synthButton = document.getElementById("synth-button");
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
// we start with a selection of pitches that generally work okay together
|
|
||||||
const sopranoTones = ["B5", "A5", "G5", "F#5", "F5", "E5", "D5", "C5", "B4", "Bb4", "A4", "G4", "F#4", "F4", "E4"];
|
|
||||||
const altoTones = ["E5", "D5", "C5", "B4", "Bb4", "A4", "G4", "F#4", "F4", "E4", "D4", "C4", "B3", "Bb3", "A3", "G3"];
|
|
||||||
const tenorTones = ["G4", "F#4", "F4", "E4", "D4", "C4", "B3", "Bb3", "A3", "G3", "F3", "E3", "D3", "C3"];
|
|
||||||
const bassTones = ["C2", "D2", "E2", "F2", "G2", "A2", "Bb2", "B2", "C3", "D3", "E3", "F3", "G3"];
|
|
||||||
|
|
||||||
export const pitchsets: string[][] = [sopranoTones, altoTones, tenorTones, bassTones];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* now we define some rules to allow for the program to follow so it can some basic tenets of music theory
|
|
||||||
* we include all pitches, so that it can use semitone-based pitch logic focused on base-12
|
|
||||||
*
|
|
||||||
* some basic rules:
|
|
||||||
* no tritones
|
|
||||||
* no minor 2nds or major 7ths
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const evaluateVector = (vector: number[]): boolean => ((vector.includes(1) || vector.includes(6)));
|
|
||||||
|
|
||||||
export const rejectDissonance = (vector: number[]) => {
|
|
||||||
|
|
||||||
}
|
|
||||||
7
src/vector_logic/evaluateVector.ts
Normal file
7
src/vector_logic/evaluateVector.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export const evaluateVector = (vector: number[]): boolean => {
|
||||||
|
return ((vector.includes(1) || vector.includes(6)));
|
||||||
|
}
|
||||||
|
|
||||||
|
export const rejectDissonance = (vector: number[]) => {
|
||||||
|
return;
|
||||||
|
}
|
||||||
21
src/vector_logic/extractPitchset.ts
Normal file
21
src/vector_logic/extractPitchset.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import { musicalPitches } from "../harmonyUtil";
|
||||||
|
|
||||||
|
export const extractPitchset = (pitches: string[]) => {
|
||||||
|
// 1) determine pitch set from given array of pitches
|
||||||
|
let pitchset: number[] = [];
|
||||||
|
|
||||||
|
for (let each of pitches) {
|
||||||
|
// filters numbers from above tones
|
||||||
|
const str = each;
|
||||||
|
const regex = /[0-9]/g;
|
||||||
|
const withoutNums = str.replace(regex, '');
|
||||||
|
const pitchNumber = musicalPitches.indexOf(withoutNums);
|
||||||
|
|
||||||
|
// ... so that they may be mapped onto numbers corresponding to the chromatic scale
|
||||||
|
pitchset.push(pitchNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
// these are sorted from lowest to highest index (something like an interval vector)
|
||||||
|
pitchset.sort((a,b) => a - b);
|
||||||
|
return pitchset;
|
||||||
|
}
|
||||||
28
src/vector_logic/findVector.ts
Normal file
28
src/vector_logic/findVector.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
export const findVector = (pitches: number[]) => {
|
||||||
|
let sorted = pitches.sort((x,y) => x - y);
|
||||||
|
// sorted = sorted.filter((num, idx) => {
|
||||||
|
// return sorted.indexOf(num) === idx;
|
||||||
|
// });
|
||||||
|
|
||||||
|
// finds each interval and logs it as a duple
|
||||||
|
let intervalClasses: number[] = [];
|
||||||
|
for (let i = 0; i < sorted.length; i++) {
|
||||||
|
let j = i+1;
|
||||||
|
|
||||||
|
// does not allow out of range values in the proceeding loop
|
||||||
|
if (j >= sorted.length) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
let thing: number = (sorted[j] - sorted[i]) % 6
|
||||||
|
if (!(intervalClasses.includes(thing))) {
|
||||||
|
intervalClasses.push(thing);
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
} while (j < sorted.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
intervalClasses = intervalClasses.sort((x,y) => x-y);
|
||||||
|
return intervalClasses;
|
||||||
|
}
|
||||||
@@ -3,7 +3,8 @@
|
|||||||
"outDir": "./built",
|
"outDir": "./built",
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"target": "es2017",
|
"target": "es2017",
|
||||||
"moduleResolution": "node"
|
"module": "CommonJS",
|
||||||
|
"moduleResolution": "node",
|
||||||
},
|
},
|
||||||
"include": ["./src/**/*"]
|
"include": ["./src/**/*", "./app"]
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user