Мне нужно создать тон, которым я могу управлять частотой и волной. Общая цель состоит в том, чтобы создать базовое пианино. Кто-нибудь знает, как я могу этого добиться?
Моя платформа для разработки — iPhone 2.x.
Мне нужно создать тон, которым я могу управлять частотой и волной. Общая цель состоит в том, чтобы создать базовое пианино. Кто-нибудь знает, как я могу этого добиться?
Моя платформа для разработки — iPhone 2.x.
Вы всегда можете начать с sin
волн. :-)
#include <cmath>
typedef double Sample;
typedef double Time;
class MonoNote {
protected:
Time start, duration;
virtual void internalRender(double now, Sample *mono) = 0;
public:
MonoNote(Time s, Time d) : start(s), duration(d) {}
virtual ~MonoNote() {}
void render(double now, Sample *mono) {
if (start <= now && now < start + duration) {
internalRender(now, mono);
}
}
};
class MonoSinNote : public MonoNote {
Time freq;
Sample amplitude;
protected:
void internalRender(double now, Sample *mono) {
const double v = sin(2*M_PI*(now - start) * freq);
*mono += amplitude*v;
}
public:
MonoSinNote(Time s, Time d, Time f, Sample a) : MonoNote(s, d), freq(f), amplitude(a) {}
~MonoSinNote() {}
};
Пианино странное. Роберт Муг написал об этом в журнале Keyboard Magazine в марте 1980 года. Основная гармоника (самая низкая частота) настроена, но каждая более высокая гармоника ярче (или «резче» или выше), чем должна быть, и на большую величину.
Гармоники со второй по девятую звучат громче основной. С десятого по двадцатый примерно такие же громкие.
Фундаментальный набухает в объеме, затем ныряет, а затем возвращается. Другие партиалы имеют характерные формы вверх и вниз. Частицы обмениваются энергией, поэтому общий объем действует так, как вы ожидаете. Но это рой частиц, торгующих энергией. Я предполагаю, что если вы правильно поймете самые низкие частоты и странный негармонический спред, у вас все будет хорошо.
Вы можете наблюдать за действием в программном анализаторе спектра и узнать то, что вам нужно знать. Аддитивный синтез, вероятно, как я бы взял на себя эту проблему.
Попробуйте Mobilesynth... синтезатор с открытым исходным кодом в магазине приложений: http://code.google.com/p/mobilesynth/
Посетите http://mda.smartelectronix.com/. Это серия плагинов VST с открытым исходным кодом. Посмотрите исходники для Piano, ePiano или DX10. Это примерно так же просто, как вы собираетесь найти.
На Форумы разработчиков Apple есть тема по этому вопросу ("Audio Synthesis"), который может дать некоторую информацию.
Ознакомьтесь с примером кода DefaultOutputUnit, который воспроизводит синусоиду.
/Разработчик/Примеры/CoreAudio/SimpleSDK/DefaultOutputUnit