AudioEngine holds pointer to an ISynth. Exact Synth type determined at runtime
diff --git a/samples/MegaDrone/src/main/cpp/AudioEngine.cpp b/samples/MegaDrone/src/main/cpp/AudioEngine.cpp
index 0ab35ff..fe55f81 100644
--- a/samples/MegaDrone/src/main/cpp/AudioEngine.cpp
+++ b/samples/MegaDrone/src/main/cpp/AudioEngine.cpp
@@ -33,9 +33,9 @@
     }
 
     if (mStream->getFormat() == AudioFormat::Float){
-        mSynthFloat = std::make_unique<Synth<float>>(mStream->getSampleRate(), mStream->getChannelCount());
+        mSynth = std::make_unique<Synth<float>>(mStream->getSampleRate(), mStream->getChannelCount());
     } else {
-        mSynthInt16 = std::make_unique<Synth<int16_t>>(mStream->getSampleRate(), mStream->getChannelCount());
+        mSynth = std::make_unique<Synth<int16_t>>(mStream->getSampleRate(), mStream->getChannelCount());
     }
 
     mStream->setBufferSizeInFrames(mStream->getFramesPerBurst() * 2);
@@ -51,23 +51,12 @@
 }
 
 void AudioEngine::tap(bool isOn) {
-
-    if (mStream->getFormat() == AudioFormat::Float){
-        mSynthFloat->setWaveOn(isOn);
-    } else {
-        mSynthInt16->setWaveOn(isOn);
-    }
+    mSynth->setWaveOn(isOn);
 }
 
 DataCallbackResult
 AudioEngine::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) {
-
-    if (mStream->getFormat() == AudioFormat::Float){
-        mSynthFloat->renderAudio(static_cast<float *>(audioData), numFrames);
-    } else {
-        mSynthInt16->renderAudio(static_cast<int16_t *>(audioData), numFrames);
-    }
-
+    mSynth->renderAudio(audioData, numFrames);
     return DataCallbackResult::Continue;
 }
 
diff --git a/samples/MegaDrone/src/main/cpp/AudioEngine.h b/samples/MegaDrone/src/main/cpp/AudioEngine.h
index 8e7b960..029ad64 100644
--- a/samples/MegaDrone/src/main/cpp/AudioEngine.h
+++ b/samples/MegaDrone/src/main/cpp/AudioEngine.h
@@ -38,8 +38,7 @@
 private:
 
     AudioStream *mStream = nullptr;
-    std::unique_ptr<Synth<float>> mSynthFloat;
-    std::unique_ptr<Synth<int16_t>> mSynthInt16;
+    std::unique_ptr<ISynth> mSynth;
 
 };
 
diff --git a/samples/MegaDrone/src/main/cpp/Synth.h b/samples/MegaDrone/src/main/cpp/Synth.h
index 48cb10c..43abb7c 100644
--- a/samples/MegaDrone/src/main/cpp/Synth.h
+++ b/samples/MegaDrone/src/main/cpp/Synth.h
@@ -29,8 +29,15 @@
 constexpr float kOscDivisor = 33;
 constexpr float kOscAmplitude = 0.009;
 
+class ISynth {
+public:
+    virtual void renderAudio(void *audioData, int32_t numFrames) = 0;
+    virtual void setWaveOn(bool isEnabled) = 0;
+};
+
+
 template <typename T>
-class Synth : public RenderableAudio<T>{
+class Synth : public ISynth {
 public:
 
     Synth(int32_t sampleRate, int32_t channelCount) {
@@ -51,15 +58,17 @@
         }
     }
 
+    // From ISynth
     void setWaveOn(bool isEnabled){
         for (auto &osc : mOscs) osc.setWaveOn(isEnabled);
     };
 
-    // From RenderableAudio<T>
-    void renderAudio(T *audioData, int32_t numFrames){
-        mOutputStage->renderAudio(audioData, numFrames);
+    // From ISynth
+    void renderAudio(void *audioData, int32_t numFrames) override {
+        mOutputStage->renderAudio(static_cast<T*>(audioData), numFrames);
     };
 
+
 private:
 
     // Rendering objects