onvoiceschanged = () => {
this.availableVoices = speechSynthesis.getVoices();
resolve();
};
}
});
}
}
// 加载预设
loadPresets() {
const savedPresets = localStorage.getItem('advancedMusicPresets');
if (savedPresets) {
const presets = JSON.parse(savedPresets);
Object.assign(this, presets);
this.updateUIFromPresets();
}
}
// 从预设更新UI
updateUIFromPresets() {
// 更新所有UI控件
document.getElementById('bpm').value = this.bpm;
document.getElementById('pitch').value = this.pitch || 1.0;
document.getElementById('volume').value = this.volume || 0.7;
document.getElementById('preset-select').value = this.currentPreset || 'pop';
document.getElementById('harmony-type').value = this.harmonyType;
document.getElementById('harmony-intensity').value = this.harmonyIntensity;
document.getElementById('time-signature').value = this.timeSignature;
document.getElementById('swing').value = this.swing;
this.updateVoiceSelection();
this.updateInstrumentSelection();
this.updateEmotionSliders();
this.updateEffectSliders();
}
// 保存预设
savePresets() {
const presets = {
voice: this.currentVoice,
instrument: this.currentInstrument,
bpm: this.bpm,
emotionProfile: this.emotionProfile,
effectProfile: this.effectProfile,
harmonyType: this.harmonyType,
harmonyIntensity: this.harmonyIntensity,
timeSignature: this.timeSignature,
swing: this.swing,
currentPreset: document.getElementById('preset-select').value
};
localStorage.setItem('advancedMusicPresets', JSON.stringify(presets));
this.showMessage('预设已保存', 'success');
}
// 设置事件监听
setupEventListeners() {
// 播放控制
document.getElementById('play-btn').addEventListener('click', () => this.togglePlay());
document.getElementById('stop-btn').addEventListener('click', () => this.stop());
document.getElementById('record-btn').addEventListener('click', () => this.toggleRecord());
document.getElementById('loop-btn').addEventListener('click', () => this.toggleLoop());
// 参数控制
document.getElementById('bpm').addEventListener('change', (e) => {
this.bpm = parseInt(e.target.value);
this.updateTempo();
});
document.getElementById('pitch').addEventListener('input', (e) => {
this.pitch = parseFloat(e.target.value);
});
document.getElementById('volume').addEventListener('input', (e) => {
this.volume = parseFloat(e.target.value);
});
document.getElementById('preset-select').addEventListener('change', (e) => {
this.loadPreset(e.target.value);
});
// 发音人选择
document.querySelectorAll('.voice-option').forEach(option => {
option.addEventListener('click', () => {
this.currentVoice = option.dataset.voice;
this.updateVoiceSelection();
this.showMessage(`发音人切换为: ${option.querySelector('div:nth-child(2) div').textContent}`);
});
});
// 乐器选择
document.querySelectorAll('.instrument-option').forEach(option => {
option.addEventListener('click', () => {
this.currentInstrument = option.dataset.instrument;
this.updateInstrumentSelection();
this.showMessage(`乐器切换为: ${option.textContent.trim()}`);
});
});
// 情感控制
document.querySelectorAll('.emotion').forEach(slider => {
slider.addEventListener('input', (e) => {
const emotion = e.target.dataset.emotion;
const value = parseInt(e.target.value);
this.emotionProfile[emotion] = value;
document.getElementById(`${emotion}-value`).textContent = `${value}%`;
this.updateEmotion();
});
});
// 效果控制
document.querySelectorAll('.effect').forEach(slider => {
slider.addEventListener('input', (e) => {
const effect = e.target.dataset.effect;
const value = parseInt(e.target.value);
this.effectProfile[effect] = value;
document.getElementById(`${effect}-value`).textContent = `${value}%`;
this.updateEffect(effect, value);
});
});
// 和声设置
document.getElementById('harmony-type').addEventListener('change', (e) => {
this.harmonyType = e.target.value;
this.updateHarmony();
});
document.getElementById('harmony-intensity').addEventListener('input', (e) => {
this.harmonyIntensity = parseInt(e.target.value);
this.updateHarmony();
});
// 节奏设置
document.getElementById('time-signature').addEventListener('change', (e) => {
this.timeSignature = e.target.value;
this.updateTimeSignature();
});
document.getElementById('swing').addEventListener('input', (e) => {
this.swing = parseInt(e.target.value);
this.updateSwing();
});
// 标签切换
document.querySelectorAll('.tab').forEach(tab => {
tab.addEventListener('click', () => {
const tabName = tab.dataset.tab;
this.switchTab(tabName);
});
});
// 保存和导出
document.getElementById('save-preset').addEventListener('click', () => this.savePresets());
document.getElementById('export-audio').addEventListener('click', () => this.exportAudio());
document.getElementById('help-btn').addEventListener('click', () => this.showHelp());
Back to home |
File page
Subscribe |
Register |
Login
| N