void BaseAudioEvent::positionEvent( int startMeasure, int subdivisions, int offset ) { int samplesPerBar = AudioEngine::samples_per_bar; // will always match current tempo, time sig at right sample rate int startOffset = samplesPerBar * startMeasure; startOffset += offset * samplesPerBar / subdivisions; setSampleStart( startOffset ); setSampleEnd (( startOffset + _sampleLength ) - 1 ); }
void ChannelRenderArea::wheelEvent(QWheelEvent *event) { uint64_t sampleStartNew, sampleEndNew; float zoomFactorNew; /* FIXME: Make this constant user-configurable. */ zoomFactorNew = getZoomFactor() + 0.01 * (event->delta() / WHEEL_DELTA); if (zoomFactorNew < 0) zoomFactorNew = 0; if (zoomFactorNew > 2) zoomFactorNew = 2; /* FIXME: Don't hardcode. */ setZoomFactor(zoomFactorNew); sampleStartNew = 0; /* FIXME */ sampleEndNew = getNumSamples() * zoomFactorNew; if (sampleEndNew > getNumSamples()) sampleEndNew = getNumSamples(); setSampleStart(sampleStartNew); setSampleEnd(sampleEndNew); #if 0 uint64_t sampleStartNew, sampleEndNew; sampleStartNew = getSampleStart() + event->delta() / WHEEL_DELTA; sampleEndNew = getSampleEnd() + event->delta() / WHEEL_DELTA; /* TODO: More checks. */ #if 1 if (sampleStartNew < 0 || sampleEndNew < 0) return; if (sampleStartNew > 512 * 1000 || sampleEndNew > 512 * 1000 /* FIXME */) return; #endif setSampleStart(sampleStartNew); setSampleEnd(sampleEndNew); /* FIXME: Use len? */ #endif repaint(); }
void ModulatorSamplerSound::setPropertyInternal(Property p, int newValue) { switch (p) { case ID: jassertfalse; break; case FileName: jassertfalse; break; case RootNote: rootNote = newValue; break; case VeloHigh: { int low = jmin(velocityRange.findNextSetBit(0), newValue, 127); velocityRange.clear(); velocityRange.setRange(low, newValue - low + 1, true); break; } case VeloLow: { int high = jmax(velocityRange.getHighestBit(), newValue, 0); velocityRange.clear(); velocityRange.setRange(newValue, high - newValue + 1, true); break; } case KeyHigh: { int low = jmin(midiNotes.findNextSetBit(0), newValue, 127); midiNotes.clear(); midiNotes.setRange(low, newValue - low + 1, true); break; } case KeyLow: { int high = jmax(midiNotes.getHighestBit(), newValue, 0); midiNotes.clear(); midiNotes.setRange(newValue, high - newValue + 1, true); break; } case RRGroup: rrGroup = newValue; break; case Normalized: isNormalized = newValue == 1; if (isNormalized && normalizedPeak < 0.0f) calculateNormalizedPeak(); break; case Volume: { gain.set(Decibels::decibelsToGain((float)newValue)); break; } case Pan: { pan = (int)newValue; leftBalanceGain = BalanceCalculator::getGainFactorForBalance((float)newValue, true); rightBalanceGain = BalanceCalculator::getGainFactorForBalance((float)newValue, false); break; } case Pitch: { centPitch = newValue; pitchFactor.store(powf(2.0f, (float)centPitch / 1200.f)); break; }; case SampleStart: FOR_EVERY_SOUND(setSampleStart(newValue)); break; case SampleEnd: FOR_EVERY_SOUND(setSampleEnd(newValue)); break; case SampleStartMod: FOR_EVERY_SOUND(setSampleStartModulation(newValue)); break; case LoopEnabled: FOR_EVERY_SOUND(setLoopEnabled(newValue == 1.0f)); break; case LoopStart: FOR_EVERY_SOUND(setLoopStart(newValue)); break; case LoopEnd: FOR_EVERY_SOUND(setLoopEnd(newValue)); break; case LoopXFade: FOR_EVERY_SOUND(setLoopCrossfade(newValue)); break; case LowerVelocityXFade: lowerVeloXFadeValue = newValue; break; case UpperVelocityXFade: upperVeloXFadeValue = newValue; break; case SampleState: setPurged(newValue == 1.0f); break; default: jassertfalse; break; } }