A bluetooth app that serves as a modulation and pitch wheel and can interface with FL Studio as a midi device - does it exist?

I’m not sure where to put this exactly, but I have a Yamaha P45 piano but it doesn’t come with a mod wheel. So I was thinking, can I somehow link my Android phone (Xiaomi Pocophone F1) and use it as a mod and pitch wheel?

My motherboard is Bluetooth capable (Strix-E X570).

How complicated is this to make? I have some experience in C# and have messed a bit with Xamarin in Visual Studio, but I know nothing about passing bluetooth signals as a MIDI input to FL Studio.

Here’s a picture describing what I wanna do:

image

I don’t know of anything that does this over Bluetooth. You could pickup a used iPhone or iPad. There is a USB to midi adapter for iDevices and you plug that directly into you piano.

I actually found an app that does exactly what I want, but it was discontinued and was for iphone:

So it can be done.

I also found that this guy has done it in what seems to be 2006:

http://www.motorhueso.net/midipoet/mobile/index_eng.htm?fbclid=IwAR2ddWe32VxX2aE4EQeB2-ortrXTeefpdEofuNZWsDbWEfMG-5AN5Tz0dBI

I’m thinking of starting a personal project with this, but I have no idea where to start even…

I had a problem with my logitech mouse where the vertical scroll wheel for the thumb was too slow. (On ubuntu desktop) Literally everything I tried involving drivers, xorg custom configs etc never worked. The solution that ended up working for me. Was I found a post which said remap the buttons on your mouse for the scroll (xinput scroll are basically just button presses). Then use xbindkeys to send / run the horizontal scroll at higher output amounts.

Granted if your running FL studio the odds of running on windows is much higher. You may have to make an app for your phone with two sliders like you pictured. If you have android its… relatively easy to make a simple app with android studio and enabling developer mode on your phone. You’ll have to add location data permissions (because location data is part of bluetooth permissions). The computer side of things I’ve not done bluetooth work. If you can make a listener essentially listen to the signals and the states and position of the sliders. Which then could be sent as key presses into FL studio.

I haven’t used FL studio in years, it may be difficult to set custom bindings, for mod controls. (I just can’t remember) It may require you build a plugin for FL studio to make it function.

One thing I remember being very frustrating while using a keyboard with FL studio was latency. Anything over 30-50 ms I found irritating. Anything above 100 I found difficult to play. I don’t know for sure the latency of bluetooth but google says it can be 34 ms up to 100/300 ms. Which, might kill things for you right then and there.

It may be possible to make it work, but not sure it would be ideal. Possibly a Arduino with analog controls that behaves like a usb keyboard / controller input might be faster latency if you want to build it yourself. If that something you would want to do.

Hope that gives some info / jumping off points

1 Like

Looking at this, basically, you will need to have your phone attached to your machine as a Midi device or a BT HID and then have FL Studio listen to it, which means you may need to write a driver if MidiYoke is no longer maintained.

1 Like

Bloody hell, this is gonna be more complicated than I imagined.

Apparently what I need to use to get the latency down is the aptX LL codec (the one that should be lower than 40 ms). But I’m not sending audio data to headphones, but simple midi signals. According to the wiki, the aptX/aptX HD and aptX adaptive were made part of the Android Open Source Project. aptX LL doesn’t seem to be on this list.

Even so, this proves it is possible to send data via bluetooth quickly enough to make this app/driver/plugin feasible. I know that 100 ms is not good enough from when I tried to listen to my piano on my PC - 50 ms seems to be ok.

I’ll look into Android Studio as you suggested and see if I can follow your advice. I’m diving into this stuff practically blind. What could possibly go wrong?

If I can’t find my way with Android Studio, I’ll try Xamarin.Forms and see how far I can get with it - there seem to be quite a bit of tutorials out on YouTube about it last I checked.

These inputs need to be passed on to Bluetooth somehow(?) but thanks for your advice about permissions.

1 Like

Keep us posted. Devember is coming up, and if you don’t start on it before then, that could be a good motivator. Plus you have the forvms to bounce ideas off of now.

Alright, I installed Android Studio and got to figuring out how Java works (found a good tutorial on it).

First I had to set up the emulator for Ryzen - enabling it in BIOS and disabling Hyper V, Virtual Machine Platform and Windows Hypervisor platform in Windows Features.

After that was up and running, I was looking around in Java trying to find what listener to use (and how). Found some Indian guy explaining it - not exactly sure how object oriented code works, it’s very different from MATLAB.

But I managed to make it pass X and Y position of where the user is touching the screen, which is basically all the input I need.

This is what it looks like - I’ve set it so it prints out the X and Y.

public class MainActivity extends AppCompatActivity {

public int X;
public int Y;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     ConstraintLayout myLayout = (ConstraintLayout)  findViewById(R.id.MainLayout);
     myLayout.setOnTouchListener(new View.OnTouchListener() {
         @Override
         public boolean onTouch(View view, MotionEvent motionEvent) {
             Log.i("TouchEvents","Touch is detected.");

             int eventType = motionEvent.getActionMasked();
             X = (int)motionEvent.getX();
             Y = (int)motionEvent.getY();

             switch (eventType)
             {
                 case MotionEvent.ACTION_DOWN:
                     break;
                 case MotionEvent.ACTION_UP:
                     break;
                 case MotionEvent.ACTION_MOVE:
                     Log.d("PositionXY","Xvalue: " + X);
                     Log.d("PositionXY","Yvalue: " + Y);
                     break;
             }
             return true;
         }
     });

    };

}

Now I need to figure out how to pass them on to Bluetooth, and maybe add some UI elements.

So what you need is the reference to the Android API to do this. You may have to drop down to the NDK (the C libraries under the hood of Android to support platform specific bits) in order to do this. Here is the General API reference.

Bluetooth in particular: