Git Product home page Git Product logo

djshaji / amp-rack Goto Github PK

View Code? Open in Web Editor NEW
42.0 8.0 5.0 505.39 MB

Amp Rack is a Guitar / Voice Audio Effects Processor for Android. Amp Rack is an Open Source LADSPA Plugins Host for Android. More than 150 high quality audio plugins are available which can be added in any order to the audio effect chain to create distinct high quality tones for your guitar!

Home Page: https://amprack.in

License: Apache License 2.0

Java 24.78% CMake 0.38% C++ 46.42% C 28.24% Kotlin 0.18%
android audio audio-processing audio-recorder guitar ladspa ladspa-plugins ndk oboe lv2 lv2-host lv2-plugin lv2-plugins video video-recorder video-recording ladspa-host

amp-rack's Introduction

Amp Rack Audio Effects Processor / LADSPA Host for Android

Get it on Google Play

Amp Rack is a Guitar / Voice Audio Effects Processor for Android. Amp Rack is an Open Source LADSPA Plugins Host for Android. More than 150 high quality audio plugins are available which can be added in any order to the audio effect chain to create distinct high quality tones for your guitar!


Introducing Amp Rack Version 2!

This is the biggest update of Amp Rack till date, and contains tons of new features and under the hood bug fixes.

An overview:

  1. All new Backing Track player. Simply record some chords and use it on loop as a backing track! You can change BPM and Volume of the backing track. Perfect to practice solos or master scales
  2. All new Drum Machine. Transform yourself into a one man band, or just practice rocking out. Choose from a variety of exciting tracks. Change BPM according to your genre and preference.
  3. Improved Presets Loading
  4. Improved recorded audio sharing support
  5. Beautiful new material design 3 themes

Features

  • High Quality Audio Plugins such as different Distortion, Overdrive, Cabinet Emulation, Delay, Echo, Reverb, Compressors, Limiters, Sustain, Vocoders, Tube Emulators, and even Autotune (and many more!

  • Easy to use UI with customizable background!

  • One click operation: add a new effect to the chain, or use presets created by professional guitarists for beautiful instant ready made tones for your tracks!

  • Add Unlimited effects in any order to the effect chain

  • Customize effect parameters as per your sound preference

  • Save presets and share with the world!

  • Supports Mic / Mic in jack / USB Interfaces. No need for expensive accessories. Just buy any generic 1/4" TRS to 3.5mm adapter for less than and rock on!

  • High performance Low Latency Native Audio Processing: No latency on even the most basic devices

  • All new Backing Track player. Simply record some chords and use it on loop as a backing track! You can change BPM and Volume of the backing track. Perfect to practice solos or master scales

  • All new Drum Machine. Transform yourself into a one man band, or just practice rocking out. Choose from a variety of exciting tracks. Change BPM according to your genre and preference.

  • High performance realtime low latency code

  • High quality floating point precision audio processing

  • Completely Open Source App: Download the code from https://amprack.acoustixaudio.org

Screenshots

amp-rack's People

Contributors

djshaji avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

amp-rack's Issues

Spinner for Amp Models

Currently we simply have a slider for all kinds of LADSPA controls. Some plugins have different control types e.g. Amp Models which work correctly on other LADSPA hosts. So implement that

Improve documentation

  • In app help system
  • in App how to
  • website with how to guides / help documentation
  • Github wiki
  • Guthub Readme

immediate native crash when loading first patch on Pixel 7 Pro

Device Pixel 7 Pro
OS UDC beta AP1A.240305.019

REPRO STEPS
Install from Play Store
Connect analog iRig 2 to a Google USB headset adapter.
Connect USB adapter to phone.
Launch app.
Go through Wizard.
Press Tap to Load

EXPECT - see patch load and begin running

ACTUAL - app crashed immediately

Native crash stackdump from the bugreport:
amprack_stackdump.txt

Let me know if you need more info.

Full screen patch changer

The idea is to change patch easily and quickly during a performance. Currently this might be the best idea possible. Also explore others

Exception java.lang.IndexOutOfBoundsException

Exception java.lang.IndexOutOfBoundsException: at androidx.recyclerview.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition (RecyclerView.java:5974) at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:6158) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:6118) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:6114) at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next (LinearLayoutManager.java:2303) at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk (LinearLayoutManager.java:1627) at androidx.recyclerview.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1587) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager.java:665) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1 (RecyclerView.java:4085) at androidx.recyclerview.widget.RecyclerView.dispatchLayout (RecyclerView.java:3849) at androidx.recyclerview.widget.RecyclerView.onLayout (RecyclerView.java:4404) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812) at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656) at android.widget.LinearLayout.onLayout (LinearLayout.java:1565) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at androidx.constraintlayout.widget.ConstraintLayout.onLayout (ConstraintLayout.java:1873) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) at android.widget.FrameLayout.onLayout (FrameLayout.java:261) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812) at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656) at android.widget.LinearLayout.onLayout (LinearLayout.java:1565) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at androidx.constraintlayout.widget.ConstraintLayout.onLayout (ConstraintLayout.java:1873) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) at android.widget.FrameLayout.onLayout (FrameLayout.java:261) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout (ActionBarOverlayLayout.java:536) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) at android.widget.FrameLayout.onLayout (FrameLayout.java:261) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812) at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656) at android.widget.LinearLayout.onLayout (LinearLayout.java:1565) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) at android.widget.FrameLayout.onLayout (FrameLayout.java:261) at com.android.internal.policy.DecorView.onLayout (DecorView.java:792) at android.view.View.layout (View.java:20680) at android.view.ViewGroup.layout (ViewGroup.java:6197) at android.view.ViewRootImpl.performLayout (ViewRootImpl.java:2831) at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2358) at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1494) at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:7288) at android.view.Choreographer$CallbackRecord.run (Choreographer.java:949) at android.view.Choreographer.doCallbacks (Choreographer.java:761) at android.view.Choreographer.doFrame (Choreographer.java:696) at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:935) at android.os.Handler.handleCallback (Handler.java:873) at android.os.Handler.dispatchMessage (Handler.java:99) at android.os.Looper.loop (Looper.java:193) at android.app.ActivityThread.main (ActivityThread.java:6923) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:870)

:running_woman: Load only added plugin instead of all avaliable plugins at startup

๐Ÿข The problem

We currently load all available shared libraries (read from a list) at startup. When the user adds a plugin to the chain, we create a new descriptor from the shared library. The problem is (I now find) that it takes up time and memory, and libraries are loaded but not used, thereby taking up RAM.

๐Ÿ’ญ The Rationale

  • I initially thought that because we have to load shared libraries to generate list of all available plugins, we have to load all plugins as well.
  • The same plugin could be loaded twice from the same shared library which has been loaded already.

๐Ÿ’ก The solution

  1. Generate list JSON of plugins and use that, instead of searching for plugins every time because this list will not change as shared libraries are included with the app and cannot be added later on.
  2. Load only that plugin which is added by the user to the chain.
  3. When the user adds a plugin, check and see if the shared library is already loaded when adding an previous plugin. If it has, use it. Else load it anew.

This causes slow load time and possible memory wastage unnecessarily. At the time since I was just learning NDK, it was a good option. But since I am a devolper now it ought to be fixed.

Audio Input Plugin

Add audio from another input source / microphone.

Use case:
record additional audio from mic when a guitar is plugged in
a.k.a sing while you rock

midi map

hi, it would be great to have an option for midi mapping for fx on/off and other CC stuff to use this app with a footswitch controller... also looper would be great idea to add for midi map))

Triggered recording / stop

  • Implement triggered recording / stop for loopable backing track setting in preferences
  • Skip silence in backing track #5 player

androidx.fragment.app.Fragment$InstantiationException

Exception java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3846) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:4022) at android.app.ActivityThread.handleRelaunchActivityInner (ActivityThread.java:6058) at android.app.ActivityThread.handleRelaunchActivity (ActivityThread.java:5953) at android.app.servertransaction.ActivityRelaunchItem.execute (ActivityRelaunchItem.java:69) at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2336) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loop (Looper.java:246) at android.app.ActivityThread.main (ActivityThread.java:8653) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130) Caused by androidx.fragment.app.Fragment$InstantiationException: at androidx.fragment.app.Fragment.instantiate (Fragment.java:628) at androidx.fragment.app.FragmentContainer.instantiate (FragmentContainer.java:57) at androidx.fragment.app.FragmentManager$3.instantiate (FragmentManager.java:483) at androidx.fragment.app.FragmentStateManager.<init> (FragmentStateManager.java:85) at androidx.fragment.app.FragmentManager.restoreSaveState (FragmentManager.java:2728) at androidx.fragment.app.FragmentController.restoreSaveState (FragmentController.java:198) at androidx.fragment.app.FragmentActivity$2.onContextAvailable (FragmentActivity.java:149) at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable (ContextAwareHelper.java:99) at androidx.activity.ComponentActivity.onCreate (ComponentActivity.java:320) at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:273) at com.shajikhan.ladspa.amprack.MainActivity.onCreate (MainActivity.java:191) at android.app.Activity.performCreate (Activity.java:8207) at android.app.Activity.performCreate (Activity.java:8191) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3819) Caused by java.lang.NoSuchMethodException: at java.lang.Class.getConstructor0 (Class.java:2332) at java.lang.Class.getConstructor (Class.java:1728) at androidx.fragment.app.Fragment.instantiate (Fragment.java:613)

Similar to cgeo/cgeo#11204 and solved here cgeo/cgeo#11385 by making all fragment classes public. So I'm gonna try the same.

๐Ÿ›ก Firebase cannot log in

๐Ÿ›ก๏ธ Cannot log in on some (installed from play store?) devices with the following error:

`W/GoogleSignInHandler: Developer error: this application is misconfigured. Check your SHA1 and package name in the Firebase console.
E/AuthUI: A sign-in error occurred.

TODO: Make the user see the login error instead of generic message

How to Guides with Pictures

How to tutorial guides with pictures

  • Record Audio
  • Add effect
  • Play drums
  • Play backing track
  • Share audio
  • Save Preset
  • Load Preset from Library
  • Plug in USB interface and use that
  • the above but with phone speakers
  • Report a bug
  • Add favourite effect, like a preset
  • change background

Maybe add Tips too

Hash Commands

๐Ÿ‘จโ€๐Ÿ’ป Implementation

  • More Shortcuts to invoke command dialog
  • auto complete recent / alphabetical command list

๐Ÿ“ Commands

  • Login / Logout
  • Device / running info (whether low latency, device name, sample rate, bits per sample etc
  • set default wallpaper
  • wallpaper auto fetch url wallpaper:https://somesite.com/?q=nature&sort=best
  • exit
  • clear chain

๐Ÿ’ก Heads up display

Would it be possible to add HUD type commands automatically from current screen? Wouldn't be too userful without an actual physical keyboard on a touch device

Free memory in LV2 code

Since I am more focused on making stuff work right now, this is a reminder to free memory in LV2 stuff

File Manager share play delete

So I was thinking we might have a file manager interface on the bottom bar. The user can play / share / delete recordings, as well as use it as a "backing track" for playing solos (yay!)

implement using exoplayer

  • Add volume slider

LV2 Support!

  • LADSPA Version 2 (LV2) Support ๐Ÿ˜ฒ
  • LV2 Fully skinned plugin interface
  • VST Support (maybe ?) ๐Ÿ˜ฎ
  • Multiple skinnable interfaces e.g Winamp, QCD et al
  • Patch Manager โžก๏ธ presets playlist for previous/ next
  • swipe left right for Full screen plugin UI , swipe up for controls: drums, record, presets, settings etc

User submitted issues 31-05-2023

  • โ€‹After clicking on QUICK tab on buttom navigation bar, the app opens a web page in browser
  • In the DRUMS tab, If I load the external audio file - I cannot delete it from the list. The error shown is "Unable to delete file".

drum tracks on bottom bar

Similar to #5 we can have a drum machine / samples looper on the bottom bar which the user can play (alongside the backing track!)

Clicks and Pops in recorded audio

There are Clicks and Pops in recorded audio (possibly because of high input gain?) or might be incorrect bits per sample or format (floating point, int32 etc) issue. It used to work beforeโ„ข

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.