Я настоятельно рекомендую использовать что-то вроде react-modal
( npm ). Это позволяет вам держать модальный контент прямо рядом с триггером. Он делает это, добавляя «портал» высоко в DOM, и обрабатывает добавление контента в is.
Ваш пример может выглядеть следующим образом:
import Modal from 'react-modal';
class Homepage extends Component {
constructor(props) {
super(props)
this.state = { modalOpen: false };
this.handleOpenModal = this.handleOpenModal.bind(this)
}
handleOpenModal() {
this.setState({ modalOpen: true });
}
render() {
return(
)
}
}
const ModalContent = () => {
return(
this is the content I want to render inside the modal
)
}
Существует много способов приблизиться к bandlimited поколению формы сигнала. Вы закончите тем, что торговали вычислительной стоимостью против качества, как обычно.
Я предлагаю, чтобы Вы смотрели на этот сайт здесь:
Проверьте архив! Это полно хорошего материала. Я просто сделал поиск на ключевом слове "bandlimited". Материал, который открывается, должен Вы быть сильно занятыми, по крайней мере, в течение недели.
Btw - Не знайте, является ли это тем, что Вы поиск, но я искажал уменьшенный (например, не действительно ограниченная полоса) поколение формы сигнала несколько лет назад. Я просто вычислил интеграл между последним и демонстрационно-позиционным текущим. Для традиционных форм сигнала синтезатора можно сделать это довольно легкое при разделении интервала интеграции в особенностях (например, когда его сброс пилообразного get). Загрузка ЦП была низкой и качество, приемлемое для моих потребностей.
У меня были те же проблемы дрейфа, но применение высоких частот с очень низкой критической частотой на интеграле избавилось от того эффекта. Реальный аналоговый синтезатор не понижается в регион подгерц так или иначе, таким образом, Вы не будете отсутствовать очень.
Это - то, что я придумал, вдохновленный идеями Nils. Вставка его здесь в случае, если это полезно для кого-то еще. Я просто фильтр поля пилообразный сигнал аналитически с помощью изменения синфазно от последнего образца как размер ядра (или сокращение). Это работает довольно хорошо, существует некоторое слышимое искажение в очень самых высоких примечаниях, но для нормального использования это звучит великолепно.
Уменьшать искажение еще больше размер ядра может быть увеличено немного, делание его 2*phaseChange, например, звучит хорошим также, хотя Вы теряете немного наибольшие частоты.
Кроме того, вот другой хороший ресурс DSP, который я нашел при просмотре SP для подобных тем: Синтез ToolKit в C++ (STK). Это - библиотека классов, которая имеет партию полезных инструментов DSP. Это даже имеет готовый использовать bandlimited генераторы формы сигнала. Метод, который они используют, должен интегрировать sinc, как я описал в своем первом сообщении (хотя я предполагаю, что они делают это лучше затем меня...).
float getSaw(float phaseChange)
{
static float phase = 0.0f;
phase = fmod(phase + phaseChange, 1.0f);
return getBoxFilteredSaw(phase, phaseChange);
}
float getPulse(float phaseChange, float pulseWidth)
{
static float phase = 0.0f;
phase = fmod(phase + phaseChange, 1.0f);
return getBoxFilteredSaw(phase, phaseChange) - getBoxFilteredSaw(fmod(phase + pulseWidth, 1.0f), phaseChange);
}
float getBoxFilteredSaw(float phase, float kernelSize)
{
float a, b;
// Check if kernel is longer that one cycle
if (kernelSize >= 1.0f) {
return 0.0f;
}
// Remap phase and kernelSize from [0.0, 1.0] to [-1.0, 1.0]
kernelSize *= 2.0f;
phase = phase * 2.0f - 1.0f;
if (phase + kernelSize > 1.0f)
{
// Kernel wraps around edge of [-1.0, 1.0]
a = phase;
b = phase + kernelSize - 2.0f;
}
else
{
// Kernel fits nicely in [-1.0, 1.0]
a = phase;
b = phase + kernelSize;
}
// Integrate and divide with kernelSize
return (b * b - a * a) / (2.0f * kernelSize);
}
Одним из быстрых способов генерации сигналов с ограниченной полосой частот является использование шагов с ограниченной полосой пропускания (BLEP). Вы генерируете сам шаг с ограничением по полосе:
и сохраняете его в волновой таблице, а затем заменяете каждый переход шагом с ограничением по полосе для создания сигналов, которые выглядят следующим образом:
См. Пошаговое руководство по адресу Синтез звука с ограниченным диапазоном .
Поскольку этот BLEP не является причинным (что означает, что он распространяется в будущем), для генерации сигналов в реальном времени лучше использовать шаг с ограничением полосы минимальной фазы, называемый MinBLEP , который имеет тот же частотный спектр, но простирается только в прошлое:
MinBLEP развивают идею и берут оконный sinc, выполняют реконструкцию минимальной фазы, а затем интегрируют результат и сохраните его в таблице . Теперь, чтобы создать осциллятор, вы просто вставляете MinBLEP на каждый разрыв в форме волны. Итак, для прямоугольной волны вы вставляете MinBLEP там, где форма волны инвертируется, для волны пилы вы вставляете MinBLEP, где значение инвертируется, но вы генерируете наклоняется как обычно.