Monday, May 23, 2016

Play midi files without midi driver using soundfonts on Android

Audience: Normal user
Platform:  Android


After trying to setup midi in Linux i decided to use Software Synthesis based players with custom soundfonts. Before that i will give basics of midi. Skip to APPs section if you don't want to read about midi system below.


How MIDI works?
Suppose you have memorized a pattern on piano notes and playing it on piano. Unfortunately there is no synthesizer (synth) & speaker attached. So before setting it up with synth you wrote every piano key activity on a paper or a file. You saved it like "C4 C4 D4# ... PITCH_WHEEL ... VOLUME_UP etc". Now you know the pattern, raga or rhythm of your music. Midi file is exactly this saved record!. Means there is no SOUND DATA. You write on paper that you payed a sitar or guitar. But how does that sound? To save that we really need sound file itself. That is the reason midi files are very small because there is no sound data inside mid files.

Now we know what is MID file. Now comes Synthesizer. That missing sound is produced by synth that is why the name. Midi tells a synth to play an instrument named guitar. Therefore depending upon a synth midi sound different. The big problem is that we create a music with our instruments and assume mid file will play same but if instruments are of low quality or even different in timbre may give totally different music. There are many solutions to this. Easiest solution is to produce stream music like mp3 ogg. However what is there are 1000 midi musics but very less disk space?. Its always recommended to keep midi files with original set of instruments so that in future we can reuse them for editing, remixing or other work. What we do is collect all the instruments sounds recorded and save in a bundle called SoundFont. Just like a font which contains set of Alphabets of a language.



So we have a solution.
Midi + SoundFont = Low size & preserved quality of OST (original sound track). 
More details about the topics covered can be found on wiki or tutorials on web.



APPs:

For windows, Mac related midi can be found on this link http://adamrehn.com/articles/playing-midi-soundfonts/


Android Version:
There are some apps which play midi using soundfont viz -

DroindSound, Timidity AE Player, LiveMidi, Midi Voyager, SoundFont-Midi-Player


SoundFont-Midi-Player is my own player i developed to play midi files with different soundfonts fast. It can change soundfonts easily and fast!. Do try it here -

https://play.google.com/store/apps/details?id=org.greh.soundfontmidiplayer

  • Switches between SoundFonts fast
  • Test SoundFont instruments using piano & USB MIDI Keyboard
  • Play Piano together with Midi music. However it also changes the instrument being played in Midi music.
  • Supports USB MIDI keyboard. Supports PITCH BEND messages, Pedal, Volume, Key events. AFAIK not all android apps do this. Tested M-AUDIO KeyRig 49 on Moto-G phone. Doing pitch bend on Android phone using USB Midi keyboard needs good response. I tested this app on some low end phones and it works fine.
  • Samplerates from 22050 to 96000Hz
  • Reverb & Chorus effects
  • Crystalizer audio effect. (Currently disabled)
  • FluidSynth is powerful and i think my app is the only one using latest FluidSynth 1.1.6 with GLIB Android build. Powered by Unmodified FluidSynth 1.1.6 Android Version. If modified source is used i will make the source available here.
  • More features described in PlayStore page.


Features to add:
- Hack Soundfont instrument without altering soundfont files to test midi music


Pro version i am planning to build with more useful features:
- Export as streaming music to ogg- Export self contained midi music i.e. rmid, (mod?)

Sunday, March 13, 2016

How much Android Non-Promoted Apps Earn?

UPDATED part of article begins "UPDATE"  section below.

This article will be short and straight to what a developer must know. If you come across articles like “how I earned millions and blah blah” then in many cases they are doing their marketing only. In business many people don't want to create competitors for free and one making such money will not make noise every place like spammer. Most people publish such articles just to attract people do some affiliate marketing, get visits/installs or sell their contents by making you dream high.


When one says “some of our people earn millions” truly means only some of them earn. Some can even be only one. What this article is about? Well by seeing the figures you can judge yourself how much real money comes even after publishing 5-10+ apps with ads. I came to see even much more poor stats for paid apps.

Lets look at the stats, screen-shot of Adsense Mobile app -










This is screen-shot of income from 5+ apps in total. Looking at stats you might feel how disastrous the income is? You are right, it is disastrous to shut down anyone's career. I used to make 200x than this in Nokia Ovi store. I will not disclosure the exact links of apps and detailed income report.


The screen-shot shows LifeTime 27,709 Ads shown in screen and made $47+. Great thing is that this will still be deducted when Google will take 30% of this and then US government will deduct taxes and Indian Government will deduct taxes. I have rough estimate that will result in total real income in hand ~$20-25. With this anyone can buy 1+ Birthday cakes. So what do you think where is the problem? It is not in Ads. It is in lesser number of downloads. So how much is less? Let me tell how much these apps got producing above income. Out of ~8 apps 4 didn't got any downloads to be shared here. Without giving names I am sharing stats: Puzzle Game - ~950 Downloads in 3yrs. Action Game - ~6000 downloads in 9 months. App 1 - ~250 downloads in 2yrs. 3 Apps launched in December 2015 - < 50 downloads (Were utilities like Fake SMS, Notification tool etc). Some more apps recently launched which have crossed 100+ downloads in less time with zero promotion.



At present all downloads I get are from organic users by nearly zero promotion. I don't have enough money for promotion. Most apps don't even cross 50 downloads in months. I was talking about how much daily downloads is less. Well I am sharing how much do I get then you take average of how much these numbers make money. Last year I was getting around ~80 downloads daily for my Bestial Kungfu game. It used to make ~$0.2+ daily. Today all apps get 30-100 daily downloads and earn always less than ~$0.2.

If they get downloaded 100x more then income becomes $20 daily. That means 500+ daily downloads are absolute minimum. Rest calculation is up to you. I can give one important tip which is its useless to make lots of apps. Quantity will not work. I tried making FakeSMS, Gallery, Notification tool, File Monitoring app, runner 2d games, 3d games like Temple Run, 3D tools etc. This article does not means there is no money. I know many are making great money from very simple apps. What really matters is timing. If some app is not there it can be you to build it. I am working on those apps and focusing on website more than before.



UPDATE

I have got more stats to share. My app imagesizereducer. From past 2-3 months gets 500+ downloads daily. Sometimes 750+. From all apps i get ~1000 downloads a day. I use Banner ads on above app and users mostly come from Asia. The daily income is still not USD 1 a day. Sometimes it goes 1+ but on average its not even $1.








Saturday, March 12, 2016

Compiling GraphicsMagick (1.3.23) using Android NDK

Compiling GraphicsMagick (1.3.23) using Android NDK


Before starting read this common guide how to build libpng with Android NDK  for most of 
building process as it will be re-writing of same stuff if I write here as well.

After above guide understood and ensured the NDK and other tools are correctly setup.
Follow these step to build GraphicsMagick 1.3.23.
 

Setup:
  • Create directory GM and extract GraphicsMagick 1.3.23 contents inside it. Go inside extracted GM directory.
  • Create directories "prefix" and "dependencies". Instead of prefix you can give names like bin, binaries etc.
  • Copy lib****.a files in GM/dependencies directory. libjasper.a liblzma.a libtiff.a libfreetype.a libjpeg.a libpng.a libwebp.a. If you don't have these libraries then with help of above libpng, webp, FreeType etc guide you can make them.
  • Create GM/dependencies/include directory and copy APIs i.e. headers from all above libraries inside it.
Below is the script to build GraphicsMagick. It does not build c++ apis.


Android Script

# AndroidBuild.sh START
#!/bin/sh
# http://www.ourinnovativemind.in
# http://www.gamesgreh.in

# use custom build environment
export DEPENDENCIES="`pwd`/dependencies"
export INC_DEPENDENCIES=${DEPENDENCIES}/include
export INC_JPEG=${INC_DEPENDENCIES}/jpeg
export INC_PNG=${INC_DEPENDENCIES}/png
export INC_TIFF=${INC_DEPENDENCIES}/tiff
export INC_WEBP=${INC_DEPENDENCIES}/webp
export INC_TTF=${INC_DEPENDENCIES}/ttf
export INC_JASPER=${INC_DEPENDENCIES}/jasper
export INC_LZMA=${INC_DEPENDENCIES}/lzma


export EXTRA_INCLUDES="-I${INC_DEPENDENCIES} -I${INC_JPEG} -I${INC_PNG} -I${INC_TIFF} -I${INC_WEBP} -I${INC_TTF} -I${INC_JASPER} -I${INC_LZMA}"
export EXTRA_LIBS=$DEPENDENCIES


export CONFIGURATION_OPTIONS="--disable-largefile --disable-openmp --without-magick-plus-plus --disable-installed --without-threads --without-x --without-perl --disable-shared --without-gslib"



# use custom build environment

# installation directory
export PREFIX="`pwd`/prefix"

# Path of NDK. For simplicity make symlinks in home directories
export NDK=/home/bindesh/bin/ndk

# processor specific libraries and includes.
# Suffix for arch-???. arch-arm  arch-arm64  arch-mips  arch-mips64  arch-x86  arch-x86_64
export ARCH=arm

# compiler for processor
export CROSS_COMPILE=arm-linux-androideabi

# Android platform version
export PLATFORM=android-8

# GCC compiler version
export GCC_VERSION=4.8


# Getting toolchain directory inside NDK from variables set above
# Hardcoded for linux running on x86 cpu 64-Bit
export ANDROID_PREFIX="${NDK}/toolchains/$CROSS_COMPILE-$GCC_VERSION/prebuilt/linux-x86_64"

# SYSROOT. usr dir i.e. usr/include, usr/lib
export SYSROOT="${NDK}/platforms/$PLATFORM/arch-$ARCH"
export CROSS_PATH="${ANDROID_PREFIX}/bin/${CROSS_COMPILE}"

# Some compiler and binutils. More might be needed depending on source. 
export CPP=${CROSS_PATH}-cpp
export AR=${CROSS_PATH}-ar
export AS=${CROSS_PATH}-as
export NM=${CROSS_PATH}-nm
export CC=${CROSS_PATH}-gcc
export CXX=${CROSS_PATH}-g++
export LD=${CROSS_PATH}-ld
export RANLIB=${CROSS_PATH}-ranlib

# for C++ extra libs
export CXX_SYSROOT=${NDK}/sources/cxx-stl/gnu-libstdc++/${COMPILER_VERSION}  # standard template library
export CXX_BITS_INCLUDE=${CXX_SYSROOT}/libs/armeabi/include

export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig


# Flags for compiler
export CFLAGS="${CFLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${ANDROID_PREFIX}/include ${EXTRA_INCLUDES}"
export CPPFLAGS="${CFLAGS}"
export LDFLAGS="${LDFLAGS} -L${SYSROOT}/usr/lib -L${ANDROID_PREFIX}/lib -L${EXTRA_LIBS}"


./configure --host=${CROSS_COMPILE} --with-sysroot=${SYSROOT} --prefix=${PREFIX} "$@" $CONFIGURATION_OPTIONS
make
make install
# AndroidBuild.sh END


Copy all lines above and paste in a new file AndroidBuild.sh and save. Then change the 
variables valid for your system. Create folder prefix or whatever name you like. 
Change NDK variable and compiler related values as per your system.
This script copied from web can cause error due to removal of newlines for strange reasons.
Ensure # is ahead of comments. 
 Now run sh AndroidBuild.sh. It should end without errors. This will install all built files
in prefix directory. Now we can copy libpng16.a renamed to libpng.a and headers directory.


Links:

Script file
http://txt.do/5ns57 or http://textuploader.com/5ns57