101 lines
2.4 KiB
JavaScript
101 lines
2.4 KiB
JavaScript
/**
|
|
* Copyright 2016 Google Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import Piano from 'Piano/src/Piano'
|
|
import Tone from 'Tone/core/Tone'
|
|
import PolySynth from 'Tone/instrument/PolySynth'
|
|
import Frequency from 'Tone/type/Frequency'
|
|
import MonoSynth from 'Tone/instrument/MonoSynth'
|
|
|
|
class Sound {
|
|
constructor(){
|
|
|
|
this._range = [36, 108]
|
|
|
|
/**
|
|
* The piano audio
|
|
* @type {Piano}
|
|
*/
|
|
this._piano = new Piano(this._range, 1, false).toMaster().setVolume('release', -Infinity)
|
|
|
|
/**
|
|
* The piano audio
|
|
* @type {Piano}
|
|
*/
|
|
this._aipiano = new Piano(this._range, 1, false).toMaster().setVolume('release', -Infinity)
|
|
|
|
this._synth = new PolySynth(8, MonoSynth).toMaster()
|
|
this._synth.set({
|
|
oscillator : {
|
|
type : 'pwm',
|
|
modulationFrequency : 3
|
|
},
|
|
envelope : {
|
|
attackCurve : 'linear',
|
|
attack : 0.05,
|
|
decay : 0.3,
|
|
sustain : 0.8,
|
|
release : 3,
|
|
},
|
|
filter : {
|
|
type : 'lowpass'
|
|
},
|
|
filterEnvelope : {
|
|
baseFrequency : 800,
|
|
octaves : 1,
|
|
attack : 0.3,
|
|
decay : 0.1,
|
|
sustain : 1,
|
|
release : 3,
|
|
}
|
|
})
|
|
this._synth.volume.value = -36
|
|
|
|
window.synth = this._synth
|
|
}
|
|
|
|
load(){
|
|
const salamanderPath = 'audio/Salamander/'
|
|
|
|
return Promise.all([this._piano.load(salamanderPath), this._aipiano.load(salamanderPath)])
|
|
}
|
|
|
|
keyDown(note, time=Tone.now(), ai=false){
|
|
|
|
if (note >= this._range[0] && note <= this._range[1]){
|
|
if (ai){
|
|
this._aipiano.keyDown(note, 1, time)
|
|
this._synth.triggerAttack(Frequency(note, 'midi').toNote(), time)
|
|
} else {
|
|
this._piano.keyDown(note, 1, time)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
keyUp(note, time=Tone.now(), ai=false){
|
|
if (note >= this._range[0] && note <= this._range[1]){
|
|
if (ai){
|
|
this._aipiano.keyUp(note, time)
|
|
this._synth.triggerRelease(Frequency(note, 'midi').toNote(), time)
|
|
} else {
|
|
this._piano.keyUp(note, time)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export {Sound} |