Android Open Source - voicesmith Transpose Thread






From Project

Back to project page voicesmith.

License

The source code is released under:

GNU General Public License

If you think the Android project voicesmith listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Voicesmith <http://voicesmith.jurihock.de/>
 */*  www . jav a 2s  . c  om*/
 * Copyright (c) 2011-2014 Juergen Hock
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.jurihock.voicesmith.threads;

import static de.jurihock.voicesmith.dsp.Math.pow;
import static de.jurihock.voicesmith.dsp.Math.round;

import java.util.concurrent.locks.ReentrantLock;

import android.content.Context;
import de.jurihock.voicesmith.FrameType;
import de.jurihock.voicesmith.Preferences;
import de.jurihock.voicesmith.Utils;
import de.jurihock.voicesmith.dsp.KissFFT;
import de.jurihock.voicesmith.dsp.processors.NativeResampleProcessor;
import de.jurihock.voicesmith.dsp.processors.NativeTimescaleProcessor;
import de.jurihock.voicesmith.dsp.stft.StftPostprocessor;
import de.jurihock.voicesmith.dsp.stft.StftPreprocessor;
import de.jurihock.voicesmith.io.AudioDevice;

public final class TransposeThread extends AudioThread
{
  private static final ReentrantLock  lock      = new ReentrantLock(
                              true);

  private int              semitones;

  private StftPreprocessor      preprocessor  = null;
  private NativeTimescaleProcessor  timescaler    = null;
  private KissFFT            fft        = null;
  private NativeResampleProcessor    resampler    = null;
  private StftPostprocessor      postprocessor  = null;

  private float[]            analysisFrameBuffer;
  private float[]            synthesisFrameBuffer;

  public TransposeThread(Context context, AudioDevice input, AudioDevice output)
  {
    super(context, input, output);
    setSemitones(0);
  }

  @Override
  public void dispose()
  {
    super.dispose();
    disposeProcessors();
  }

  private void disposeProcessors()
  {
    if (preprocessor != null)
    {
      preprocessor.dispose();
      preprocessor = null;
    }

    if (timescaler != null)
    {
      timescaler.dispose();
      timescaler = null;
    }

    if (fft != null)
    {
      fft.dispose();
      fft = null;
    }

    if (resampler != null)
    {
      resampler.dispose();
      resampler = null;
    }

    if (postprocessor != null)
    {
      postprocessor.dispose();
      postprocessor = null;
    }
  }

  @Override
  protected void doProcessing()
  {
    while (!Thread.interrupted())
    {
      lock.lock();

      try
      {
        preprocessor.processFrame(analysisFrameBuffer);
        timescaler.processFrame(analysisFrameBuffer);
        fft.ifft(analysisFrameBuffer);
        resampler.processFrame(analysisFrameBuffer, synthesisFrameBuffer);
        postprocessor.processFrame(synthesisFrameBuffer);
      }
      finally
      {
        lock.unlock();
      }
    }
  }

  public int getSemitones()
  {
    return semitones;
  }

  @Override
  public void configure(String value)
  {
    if (value != null && value.length() > 0)
    {
      int semitones = Integer.parseInt(value);
            setSemitones(semitones);
    }
  }

  /**
   * Allowed values: [-12..0..12]
   * */
  public void setSemitones(int semitones)
  {
    this.semitones = semitones;
    reset(pow(2F, semitones / 12F));
  }

  /**
   * Allowed values: [0.5..1..2]
   * */
  private void reset(float tau)
  {
    lock.lock();

    try
    {
      Preferences preferences = new Preferences(context);

      final FrameType frameType = FrameType.Default;
      final int frameSize = preferences.getFrameSize(
        frameType, input.getSampleRate());
      final int hopSize = preferences.getHopSize(
        frameType, input.getSampleRate());

      final int synthesisHopSize = hopSize;
      final int analysisHopSize = (int) round(hopSize / tau);

      final int synthesisFrameSize = (int) round(frameSize / tau);
      final int analysisFrameSize = frameSize;

      disposeProcessors();

      preprocessor = new StftPreprocessor(input,
        analysisFrameSize, analysisHopSize, true);
      timescaler = new NativeTimescaleProcessor(analysisFrameSize,
        analysisHopSize, synthesisHopSize);
      fft = new KissFFT(analysisFrameSize);
      resampler = new NativeResampleProcessor(
        analysisFrameSize, synthesisFrameSize);
      postprocessor = new StftPostprocessor(output,
        synthesisFrameSize, analysisHopSize, false);

      analysisFrameBuffer = new float[analysisFrameSize];
      synthesisFrameBuffer = new float[synthesisFrameSize];

      new Utils(context).log("Transpose frame sizes are %s and %s.",
        analysisFrameBuffer.length, synthesisFrameBuffer.length);
    }
    finally
    {
      lock.unlock();
    }
  }
}




Java Source Code List

de.jurihock.voicesmith.AAF.java
de.jurihock.voicesmith.Application.java
de.jurihock.voicesmith.ChangeLog.java
de.jurihock.voicesmith.DAFX.java
de.jurihock.voicesmith.Disposable.java
de.jurihock.voicesmith.FrameType.java
de.jurihock.voicesmith.Preferences.java
de.jurihock.voicesmith.Utils.java
de.jurihock.voicesmith.activities.AafActivity.java
de.jurihock.voicesmith.activities.AboutActivity.java
de.jurihock.voicesmith.activities.AboutApplicationActivity.java
de.jurihock.voicesmith.activities.AboutLicenseActivity.java
de.jurihock.voicesmith.activities.AudioServiceActivity.java
de.jurihock.voicesmith.activities.ContributionActivity.java
de.jurihock.voicesmith.activities.DafxActivity.java
de.jurihock.voicesmith.activities.HomeActivity.java
de.jurihock.voicesmith.activities.PreferenceActivity.java
de.jurihock.voicesmith.activities.SupportActivity.java
de.jurihock.voicesmith.audio.AudioDeviceManager.java
de.jurihock.voicesmith.audio.HeadsetManagerListener.java
de.jurihock.voicesmith.audio.HeadsetManager.java
de.jurihock.voicesmith.audio.HeadsetMode.java
de.jurihock.voicesmith.dsp.KissFFT.java
de.jurihock.voicesmith.dsp.LuenbergerObserver.java
de.jurihock.voicesmith.dsp.Math.java
de.jurihock.voicesmith.dsp.SchmittTrigger.java
de.jurihock.voicesmith.dsp.Window.java
de.jurihock.voicesmith.dsp.processors.AmplifyProcessor.java
de.jurihock.voicesmith.dsp.processors.DenoiseProcessor.java
de.jurihock.voicesmith.dsp.processors.DetuneProcessor.java
de.jurihock.voicesmith.dsp.processors.HoarsenessProcessor.java
de.jurihock.voicesmith.dsp.processors.NativeResampleProcessor.java
de.jurihock.voicesmith.dsp.processors.NativeTimescaleProcessor.java
de.jurihock.voicesmith.dsp.processors.OffsetProcessor.java
de.jurihock.voicesmith.dsp.processors.ResampleProcessor.java
de.jurihock.voicesmith.dsp.processors.RobotizeProcessor.java
de.jurihock.voicesmith.dsp.processors.SeparationProcessor.java
de.jurihock.voicesmith.dsp.processors.TimescaleProcessor.java
de.jurihock.voicesmith.dsp.processors.VadProcessor.java
de.jurihock.voicesmith.dsp.stft.StftPostprocessor.java
de.jurihock.voicesmith.dsp.stft.StftPreprocessor.java
de.jurihock.voicesmith.io.AudioDevice.java
de.jurihock.voicesmith.io.dummy.DummyInDevice.java
de.jurihock.voicesmith.io.dummy.DummyOutDevice.java
de.jurihock.voicesmith.io.file.FileDevice.java
de.jurihock.voicesmith.io.file.FileInDevice.java
de.jurihock.voicesmith.io.file.FileOutDevice.java
de.jurihock.voicesmith.io.oscillators.CosineWave.java
de.jurihock.voicesmith.io.oscillators.PhaseAccumulator.java
de.jurihock.voicesmith.io.pcm.DelayedPcmInDevice.java
de.jurihock.voicesmith.io.pcm.PcmDevice.java
de.jurihock.voicesmith.io.pcm.PcmInDevice.java
de.jurihock.voicesmith.io.pcm.PcmOutDevice.java
de.jurihock.voicesmith.services.AafService.java
de.jurihock.voicesmith.services.AudioService.java
de.jurihock.voicesmith.services.DafxService.java
de.jurihock.voicesmith.services.ServiceBinder.java
de.jurihock.voicesmith.services.ServiceFailureReason.java
de.jurihock.voicesmith.services.ServiceListener.java
de.jurihock.voicesmith.threads.AudioThread.java
de.jurihock.voicesmith.threads.DelayThread.java
de.jurihock.voicesmith.threads.DetuneThread.java
de.jurihock.voicesmith.threads.HoarsenessThread.java
de.jurihock.voicesmith.threads.LowDelayThread.java
de.jurihock.voicesmith.threads.RobotizeThread.java
de.jurihock.voicesmith.threads.TransposeThread.java
de.jurihock.voicesmith.voicebank.Record.java
de.jurihock.voicesmith.voicebank.RecordsSerializer.java
de.jurihock.voicesmith.voicebank.Records.java
de.jurihock.voicesmith.widgets.AafPicker.java
de.jurihock.voicesmith.widgets.ColoredToggleButton.java
de.jurihock.voicesmith.widgets.DafxPicker.java
de.jurihock.voicesmith.widgets.DelayPicker.java
de.jurihock.voicesmith.widgets.IntervalPicker.java
de.jurihock.voicesmith.widgets.ListPreference.java
de.jurihock.voicesmith.widgets.SeekBarPreference.java