概要
なでしこをplunkerでホスティングしてみた。
plugin、書いてみた。
ドレミ、です。
サンプルコード
const PluginDoremi = {
'初期化': {
type: 'func',
josi: [],
fn: function(sys) {
sys._sakura = {
audioContext: new AudioContext(),
oto: function(key) {
var osciillatorNode = this.audioContext.createOscillator();
var envelopeGen = this.audioContext.createGain();
var freq = 440.0 * Math.pow(2.0, (key - 69.0) / 12.0);
osciillatorNode.frequency.value = freq;
osciillatorNode.connect(envelopeGen);
envelopeGen.connect(this.audioContext.destination);
var t1 = this.audioContext.currentTime;
envelopeGen.gain.cancelScheduledValues(t1);
envelopeGen.gain.setValueAtTime(1, t1);
osciillatorNode.start();
var release = 0.2;
var keyUpTime = this.audioContext.currentTime;
envelopeGen.gain.setValueAtTime(envelopeGen.gain.value, keyUpTime);
envelopeGen.gain.linearRampToValueAtTime(0, keyUpTime + release);
osciillatorNode.stop(keyUpTime + release);
},
sleep: function(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++)
{
if ((new Date().getTime() - start) > 100 * milliseconds)
{
break;
}
}
}
}
}
},
'ドレミ作成': {
type: 'func',
josi: [],
fn: function(sys) {
const id = 2
return id
}
},
'ドレミ斉唱': {
type: 'func',
josi: [],
fn: function(sys) {
var mml = sys.__getSysValue('ドレミ曲', 'MML')
for (var i = 0; i < mml.length; i++)
{
mml = mml.replace('ァ', '');
}
for (var i = 0; i < mml.length; i++)
{
var a = mml[i];
switch (a)
{
case 'a':
sys._sakura.oto('69');
break;
case 'シ':
sys._sakura.oto('71');
break;
case 'ド':
sys._sakura.oto('72');
break;
case 'レ':
sys._sakura.oto('74');
break;
case 'ミ':
sys._sakura.oto('76');
break;
case 'フ':
sys._sakura.oto('77');
break;
case 'ソ':
sys._sakura.oto('79');
break;
case 'ラ':
sys._sakura.oto('81');
break;
case 'B':
sys._sakura.oto('83');
break;
default:
break;
}
sys._sakura.sleep(4);
}
const id = 1
return id
}
},
'ドレミ曲': {
type: 'var',
value: 'MML'
}
}
navigator.nako3.addPluginObject('PluginDoremi', PluginDoremi)
成果物
以上。