Big news from Tunefox app – major update and Android version
The popular Tunefox app for learning and improving your banjo, mandolin, or guitar playing has some major news. Not only has the innovative iOS app received major updates with added features and many new songs and arrangements in the library, it is also now available for the first time for use with Android devices. The app can be downloaded from either the Apple App Store or Google Play.
Tunefox is the brainchild of a pair of Czech developers who refer to themselves only by their first names, Jiri and Jakub, both also passionate musicians. They have taken the app through a number of versions, with hundreds of tab arrangements of bluegrass favorites and jam standards available.
The app itself is a free download, and Tunefox charges a subscription fee to access the vast libraries and lessons. You can choose to pay $14.99 monthly if you only need occasional access, or annual subscriptions are only $7.50/month. They even offer a lifetime subscription for $299 for power users. Once you are subscribed, you can switch instruments at will.
One of the features that has made Tunefox so helpful for improving student pickers is the ability to choose the level of difficulty of the songs/tunes you are learning. By offering arrangements listed by difficulty, a user can master the versions in order as they feel ready. In this latest update, that function has been made even more useful with the inclusion of a difficulty slider. As you slide from difficult to easy, you will see notes drop out of the tab until you have just the very basic melody left. They have also included a vary slider, where the arrangement will add variations based on the difficulty you have chosen.
With this addition, their Hide Notes feature becomes even more valuable in helping you memorize arrangements. This feature will, as the name suggests, hide the note heads, forcing you to pull them from your memory. With this feature enabled, the tab will show which string the note is on, but not the fret number.
We spoke last week with Jordan Rhiem, chief content creator for Tunefox, who writes the arrangements these days for all new additions. He says that there is a great deal of n ew material on the banjo side, and he is working now to beef up content for guitar and mandolin. Subscribers have the ability to suggest songs that they would like to learn, and Jordan uses these suggestions to determine which tunes to put into the software.
He also created this detailed video that goes through all of the new features in the app. It is a bit lengthy (17 minutes), but very effectively describes how Tunefox works.
Tunefox is available for all iOS and Android devices, and can be downloaded at no charge from the normal sources.
[gravityform id=11 title=false description=false]
<script type=”text/javascript”>
//———————————————————-
//—— JAVASCRIPT HOOK FUNCTIONS FOR GRAVITY FORMS ——-
//———————————————————-
if ( ! gform ) {
document.addEventListener( ‘gform_main_scripts_loaded’, function() gform.scriptsLoaded = true; );
window.addEventListener( ‘DOMContentLoaded’, function() gform.domLoaded = true; );
var gform = {
domLoaded: false,
scriptsLoaded: false,
initializeOnLoaded: function( fn )
if ( gform.domLoaded && gform.scriptsLoaded )
fn();
else if( ! gform.domLoaded && gform.scriptsLoaded )
window.addEventListener( ‘DOMContentLoaded’, fn );
else
document.addEventListener( ‘gform_main_scripts_loaded’, fn );
,
hooks: action: , filter: ,
addAction: function( action, callable, priority, tag )
gform.addHook( ‘action’, action, callable, priority, tag );
,
addFilter: function( action, callable, priority, tag )
gform.addHook( ‘filter’, action, callable, priority, tag );
,
doAction: function( action )
gform.doHook( ‘action’, action, arguments );
,
applyFilters: function( action )
return gform.doHook( ‘filter’, action, arguments );
,
removeAction: function( action, tag )
gform.removeHook( ‘action’, action, tag );
,
removeFilter: function( action, priority, tag )
gform.removeHook( ‘filter’, action, priority, tag );
,
addHook: function( hookType, action, callable, priority, tag )
if ( undefined == gform.hooks[hookType][action] )
gform.hooks[hookType][action] = [];
var hooks = gform.hooks[hookType][action];
if ( undefined == tag )
tag = action + ‘_’ + hooks.length;
if( priority == undefined )
priority = 10;
gform.hooks[hookType][action].push( tag:tag, callable:callable, priority:priority );
,
doHook: function( hookType, action, args )
// splice args from object into array and remove first index which is the hook name
args = Array.prototype.slice.call(args, 1);
if ( undefined != gform.hooks[hookType][action] )
var hooks = gform.hooks[hookType][action], hook;
//sort by priority
hooks.sort(function(a,b)return a[“priority”]-b[“priority”]);
hooks.forEach( function( hookItem )
hook = hookItem.callable;
if(typeof hook != ‘function’)
hook = window[hook];
if ( ‘action’ == hookType )
hook.apply(null, args);
else
args[0] = hook.apply(null, args);
);
if ( ‘filter’==hookType )
return args[0];
,
removeHook: function( hookType, action, priority, tag )
if ( undefined != gform.hooks[hookType][action] )
var hooks = gform.hooks[hookType][action];
hooks = hooks.filter( function(hook, index, arr) priority==hook.priority);
return !removeHook;
);
gform.hooks[hookType][action] = hooks;
};
}
</script>
<div class=”gf_browser_chrome gform_wrapper gform_legacy_markup_wrapper” id=’gform_wrapper_11′ ><form method=’post’ enctype=”multipart/form-data” id=’gform_11′ action=’/big-news-from-tunefox-app-major-update-and-android-version/’ >
<div class=”gform_body gform-body”><ul id=’gform_fields_11′ class=”gform_fields top_label form_sublabel_below description_below”><li id=”field_11_10″ class=”gfield hide-label field_sublabel_below field_description_below gfield_visibility_visible” data-js-reload=”field_11_10″><label class=”gfield_label screen-reader-text” for=”input_11_10″ >First Name</label><div class=”ginput_container ginput_container_text”><input name=”input_10″ id=’input_11_10′ type=”text” value=”” class=”medium” placeholder=”First Name” aria-invalid=”false” /> </div></li><li id=”field_11_1″ class=”gfield hide-label gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible” data-js-reload=”field_11_1″><label class=”gfield_label screen-reader-text” for=”input_11_1″ >Email Address<span class=”gfield_required”><span class=”gfield_required gfield_required_asterisk”>*</span></span></label><div class=”ginput_container ginput_container_email”>
<input name=”input_1″ id=’input_11_1′ type=”text” value=”” class=”large” placeholder=”Email Address” aria-required=”true” aria-invalid=”false” />
</div></li><li id=”field_11_5″ class=”gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible” data-js-reload=”field_11_5″><label class=”gfield_label gfield_label_before_complex” >Email List :<span class=”gfield_required”><span class=”gfield_required gfield_required_asterisk”>*</span></span></label><div class=”ginput_container ginput_container_checkbox”><ul class=”gfield_checkbox” id=’input_11_5′><li class=”gchoice gchoice_11_5_1″>
<input class=”gfield-choice-input” name=”input_5.1″ type=”checkbox” value=”buzz” id=’choice_11_5_1′ />
<label for=”choice_11_5_1″ id=’label_11_5_1′>Bluegrass Buzz Newsletter</label>
</li></ul></div></li><li id=”field_11_11″ class=”gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible” data-js-reload=”field_11_11″><label class=”gfield_label” for=”input_11_11″ >Name</label><div class=”ginput_container”><input name=”input_11″ id=’input_11_11′ type=”text” value=”” /></div><div class=”gfield_description” id=’gfield_description_11_11′>This field is for validation purposes and should be left unchanged.</div></li></ul></div>
<div class=”gform_footer top_label”> <input type=”submit” id=’gform_submit_button_11′ class=”gform_button button” value=”Sign Up” onclick=’if(window[“gf_submitting_11”])return false; window[“gf_submitting_11”]=true; ‘ onkeypress=”if( event.keyCode == 13 ) if(window[“gf_submitting_11”])return false; window[“gf_submitting_11”]=true; jQuery(“#gform_11”).trigger(“submit”,[true]); ” />
<input type=”hidden” class=”gform_hidden” name=”is_submit_11″ value=”1″ />
<input type=”hidden” class=”gform_hidden” name=”gform_submit” value=”11″ />
<input type=”hidden” class=”gform_hidden” name=”gform_unique_id” value=”” />
<input type=”hidden” class=”gform_hidden” name=”state_11″ value=”WyJbXSIsIjdiZWFhNzdhMjZmM2E0NjI4MWQ1ZDY5NDIxY2FiZGVlIl0=” />
<input type=”hidden” class=”gform_hidden” name=”gform_target_page_number_11″ id=’gform_target_page_number_11′ value=”0″ />
<input type=”hidden” class=”gform_hidden” name=”gform_source_page_number_11″ id=’gform_source_page_number_11’ value=”1″ />
<input type=”hidden” name=”gform_field_values” value=”” />
</div>
<p style=”display: none !important;”><label>Δ<textarea name=”ak_hp_textarea” cols=”45″ rows=”8″ maxlength=”100″></textarea></label><input type=”hidden” id=”ak_js_1″ name=”ak_js” value=”36″/><script>document.getElementById( “ak_js_1” ).setAttribute( “value”, ( new Date() ).getTime() );</script></p></form>
</div>
[gravityform id=11 title=false description=false]
<div class=”gf_browser_chrome gform_wrapper gform_legacy_markup_wrapper” id=’gform_wrapper_11′ ><form method=’post’ enctype=”multipart/form-data” id=’gform_11′ action=’/big-news-from-tunefox-app-major-update-and-android-version/’ >
<div class=”gform_body gform-body”><ul id=’gform_fields_11′ class=”gform_fields top_label form_sublabel_below description_below”><li id=”field_11_10″ class=”gfield hide-label field_sublabel_below field_description_below gfield_visibility_visible” data-js-reload=”field_11_10″><label class=”gfield_label screen-reader-text” for=”input_11_10″ >First Name</label><div class=”ginput_container ginput_container_text”><input name=”input_10″ id=’input_11_10′ type=”text” value=”” class=”medium” placeholder=”First Name” aria-invalid=”false” /> </div></li><li id=”field_11_1″ class=”gfield hide-label gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible” data-js-reload=”field_11_1″><label class=”gfield_label screen-reader-text” for=”input_11_1″ >Email Address<span class=”gfield_required”><span class=”gfield_required gfield_required_asterisk”>*</span></span></label><div class=”ginput_container ginput_container_email”>
<input name=”input_1″ id=’input_11_1′ type=”text” value=”” class=”large” placeholder=”Email Address” aria-required=”true” aria-invalid=”false” />
</div></li><li id=”field_11_5″ class=”gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible” data-js-reload=”field_11_5″><label class=”gfield_label gfield_label_before_complex” >Email List :<span class=”gfield_required”><span class=”gfield_required gfield_required_asterisk”>*</span></span></label><div class=”ginput_container ginput_container_checkbox”><ul class=”gfield_checkbox” id=’input_11_5′><li class=”gchoice gchoice_11_5_1″>
<input class=”gfield-choice-input” name=”input_5.1″ type=”checkbox” value=”buzz” id=’choice_11_5_1′ />
<label for=”choice_11_5_1″ id=’label_11_5_1′>Bluegrass Buzz Newsletter</label>
</li></ul></div></li><li id=”field_11_11″ class=”gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible” data-js-reload=”field_11_11″><label class=”gfield_label” for=”input_11_11″ >Phone</label><div class=”ginput_container”><input name=”input_11″ id=’input_11_11′ type=”text” value=”” /></div><div class=”gfield_description” id=’gfield_description_11_11′>This field is for validation purposes and should be left unchanged.</div></li></ul></div>
<div class=”gform_footer top_label”> <input type=”submit” id=’gform_submit_button_11′ class=”gform_button button” value=”Sign Up” onclick=’if(window[“gf_submitting_11”])return false; window[“gf_submitting_11”]=true; ‘ onkeypress=”if( event.keyCode == 13 ) if(window[“gf_submitting_11”])return false; window[“gf_submitting_11”]=true; jQuery(“#gform_11”).trigger(“submit”,[true]); ” />
<input type=”hidden” class=”gform_hidden” name=”is_submit_11″ value=”1″ />
<input type=”hidden” class=”gform_hidden” name=”gform_submit” value=”11″ />
<input type=”hidden” class=”gform_hidden” name=”gform_unique_id” value=”” />
<input type=”hidden” class=”gform_hidden” name=”state_11″ value=”WyJbXSIsIjdiZWFhNzdhMjZmM2E0NjI4MWQ1ZDY5NDIxY2FiZGVlIl0=” />
<input type=”hidden” class=”gform_hidden” name=”gform_target_page_number_11″ id=’gform_target_page_number_11′ value=”0″ />
<input type=”hidden” class=”gform_hidden” name=”gform_source_page_number_11″ id=’gform_source_page_number_11’ value=”1″ />
<input type=”hidden” name=”gform_field_values” value=”” />
</div>
<p style=”display: none !important;”><label>Δ<textarea name=”ak_hp_textarea” cols=”45″ rows=”8″ maxlength=”100″></textarea></label><input type=”hidden” id=”ak_js_2″ name=”ak_js” value=”250″/><script>document.getElementById( “ak_js_2” ).setAttribute( “value”, ( new Date() ).getTime() );</script></p></form>
</div>