Hi!
My name is Alessandro. I've discovered rockbox only a couple of days
ago, but I loved it so much that I've soon built up a cross-compiling
environment on my Mac and started playing with the source..
..and now I've just completed my first nicely-working patch :)
This patch adds a little feature to the pitch menu, by enabling to
use of halftone values instead of just percentage ones for pitch
shifting. It should be useful to a musician to transpose a song into
a different key to play along with it..
I set the PLAY/PAUSE button on my iPod mini to switch between
percentage and halftones pitch shifting, by adding a new
ACTION_PS_PLAY keymap row and by coding a little logic for inc/dec
the pitch in this new way, with the same gestures as before, when in
the "halftones" mode.
I wrote and tested the code only on my iPod mini, but it should be
quickly portable -by adding a similar keymap row- to all other players.
I hope you'll like it.
Bye,
Alessandro.
***
That's the patch code:
Index: apps/action.h
===================================================================
RCS file: /cvsroot/rockbox/apps/action.h,v
retrieving revision 1.12
diff -u -r1.12 action.h
--- apps/action.h 22 Aug 2006 13:21:13 -0000 1.12
+++ apps/action.h 8 Sep 2006 23:34:58 -0000
@@ -173,6 +173,7 @@
ACTION_PS_NUDGE_LEFTOFF,
ACTION_PS_NUDGE_RIGHTOFF,
ACTION_PS_RESET,
+ ACTION_PS_PLAY,
ACTION_PS_EXIT, /* _STD_* isnt going to work here */
/* yesno screen */
Index: apps/screens.c
===================================================================
RCS file: /cvsroot/rockbox/apps/screens.c,v
retrieving revision 1.169
diff -u -r1.169 screens.c
--- apps/screens.c 3 Sep 2006 11:35:24 -0000 1.169
+++ apps/screens.c 8 Sep 2006 23:35:03 -0000
@@ -356,7 +356,7 @@
0 if no key was pressed
1 if USB was connected */
-void pitch_screen_draw(struct screen *display, int pitch)
+void pitch_screen_draw(struct screen *display, int pitch, bool
tones, int halftones)
{
unsigned char* ptr;
unsigned char buf[32];
@@ -375,14 +375,16 @@
{
/* UP: Pitch Up */
- ptr = str(LANG_SYSFONT_PITCH_UP);
+ if(tones) ptr = "1/2 Tone Up";
+ else ptr = str(LANG_SYSFONT_PITCH_UP);
display->getstringsize(ptr,&w,&h);
display->putsxy((display->width-w)/2, 0, ptr);
display->mono_bitmap(bitmap_icons_7x8[Icon_UpArrow],
display->width/2 - 3, h, 7, 8);
/* DOWN: Pitch Down */
- ptr = str(LANG_SYSFONT_PITCH_DOWN);
+ if(tones) ptr = "1/2 Tone Down";
+ else ptr = str(LANG_SYSFONT_PITCH_DOWN);
display->getstringsize(ptr,&w,&h);
display->putsxy((display->width-w)/2, display->height - h,
ptr);
display->mono_bitmap(bitmap_icons_7x8[Icon_DownArrow],
@@ -401,25 +403,86 @@
display->putsxy(0, (display->height-h)/2, ptr);
display->mono_bitmap(bitmap_icons_7x8[Icon_FastBackward],
w+1, (display->height-h)/2, 7, 8);
-
- /* "Pitch" */
- snprintf((char *)buf, sizeof(buf), str(LANG_SYSFONT_PITCH));
- display->getstringsize(buf,&w,&h);
- display->putsxy((display->width-w)/2, (display->height/2)-h,
buf);
- /* "XX.X%" */
- snprintf((char *)buf, sizeof(buf), "%d.%d%%",
- pitch / 10, pitch % 10 );
- display->getstringsize(buf,&w,&h);
- display->putsxy((display->width-w)/2, display->height/2, buf);
+
+ if(!tones){
+ /* "Pitch" */
+ snprintf((char *)buf, sizeof(buf), str
(LANG_SYSFONT_PITCH));
+ display->getstringsize(buf,&w,&h);
+ display->putsxy((display->width-w)/2, (display->height/
2)-h, buf);
+ /* "XX.X%" */
+ snprintf((char *)buf, sizeof(buf), "%d.%d%%",
+ pitch / 10, pitch % 10 );
+ display->getstringsize(buf,&w,&h);
+ display->putsxy((display->width-w)/2, display->height/2,
buf);
+ }
+ else {
+ /* "Tones" */
+ snprintf((char *)buf, sizeof(buf), "Halftones");
+ display->getstringsize(buf,&w,&h);
+ display->putsxy((display->width-w)/2, (display->height/
2)-h, buf);
+ /* "XX.X%" */
+ if(halftones >= 0) snprintf((char *)buf, sizeof(buf), "+%
d",
+ halftones );
+ else snprintf((char *)buf, sizeof(buf), "%d",
+ halftones );
+ display->getstringsize(buf,&w,&h);
+ display->putsxy((display->width-w)/2, display->height/2,
buf);
+ }
+
}
display->update();
}
+int set_pitch_with_halftones(int halftones){
+ int pitch;
+ switch (halftones) {
+ case 0:
+ pitch = 1000;
+ sound_set_pitch(pitch);
+ break;
+ case 1:
+ pitch = 1060;
+ sound_set_pitch(pitch);
+ break;
+ case 2:
+ pitch = 1122;
+ sound_set_pitch(pitch);
+ break;
+ case 3:
+ pitch = 1189;
+ sound_set_pitch(pitch);
+ break;
+ case 4:
+ pitch = 1260;
+ sound_set_pitch(pitch);
+ break;
+ case -4:
+ pitch = 794;
+ sound_set_pitch(pitch);
+ break;
+ case -3:
+ pitch = 841;
+ sound_set_pitch(pitch);
+ break;
+ case -2:
+ pitch = 891;
+ sound_set_pitch(pitch);
+ break;
+ case -1:
+ pitch = 944;
+ sound_set_pitch(pitch);
+ break;
+ }
+ return pitch;
+}
+
bool pitch_screen(void)
{
int button;
int pitch = sound_get_pitch();
+ int halftones = 0;
+ bool tones = false;
bool exit = false;
int i;
@@ -431,17 +494,24 @@
while (!exit)
{
FOR_NB_SCREENS(i)
- pitch_screen_draw(&screens[i],pitch);
+ pitch_screen_draw(&screens[i],pitch,tones,halftones);
button = get_action(CONTEXT_PITCHSCREEN,TIMEOUT_BLOCK);
switch (button) {
case ACTION_PS_INC_SMALL:
- if ( pitch < 2000 )
+ if(tones){
+ if(halftones < 4) halftones++;
+ pitch = set_pitch_with_halftones(halftones);
+ }
+ else {
+ if ( pitch < 2000 )
pitch++;
- sound_set_pitch(pitch);
+ sound_set_pitch(pitch);
+ }
break;
case ACTION_PS_INC_BIG:
+ tones = false;
if ( pitch < 1990 )
pitch += 10;
else
@@ -450,12 +520,19 @@
break;
case ACTION_PS_DEC_SMALL:
- if ( pitch > 500 )
- pitch--;
- sound_set_pitch(pitch);
+ if(tones){
+ if(halftones > -4) halftones--;
+ pitch = set_pitch_with_halftones(halftones);
+ }
+ else {
+ if ( pitch > 500 )
+ pitch--;
+ sound_set_pitch(pitch);
+ }
break;
case ACTION_PS_DEC_BIG:
+ tones = false;
if ( pitch > 510 )
pitch -= 10;
else
@@ -464,36 +541,49 @@
break;
case ACTION_PS_NUDGE_RIGHT:
+ tones = false;
if ( pitch < 1980 )
{
- pitch += 20;
+ pitch +=20;
sound_set_pitch(pitch);
FOR_NB_SCREENS(i)
- pitch_screen_draw(&screens[i],pitch);
+ pitch_screen_draw(&screens
[i],pitch,tones,halftones);
}
break;
case ACTION_PS_NUDGE_RIGHTOFF:
+ tones = false;
pitch -= 20;
sound_set_pitch(pitch);
break;
case ACTION_PS_NUDGE_LEFT:
+ tones = false;
if ( pitch > 520 )
{
- pitch -= 20;
+ pitch -=20;
sound_set_pitch(pitch);
FOR_NB_SCREENS(i)
- pitch_screen_draw(&screens[i],pitch);
+ pitch_screen_draw(&screens
[i],pitch,tones,halftones);
}
break;
case ACTION_PS_NUDGE_LEFTOFF:
+ tones = false;
pitch += 20;
sound_set_pitch(pitch);
break;
+ case ACTION_PS_PLAY:
+ if(!tones) {
+ tones = true;
+ halftones = 0;
+ pitch = set_pitch_with_halftones(halftones);
+ }
+ else tones = false;
+ break;
+
case ACTION_PS_RESET:
- pitch = 1000;
- sound_set_pitch( pitch );
+ tones = false;
+ pitch = set_pitch_with_halftones(0);
break;
case ACTION_PS_EXIT:
Index: apps/keymaps/keymap-ipod.c
===================================================================
RCS file: /cvsroot/rockbox/apps/keymaps/keymap-ipod.c,v
retrieving revision 1.11
diff -u -r1.11 keymap-ipod.c
--- apps/keymaps/keymap-ipod.c 23 Aug 2006 08:53:38 -0000 1.11
+++ apps/keymaps/keymap-ipod.c 8 Sep 2006 23:35:05 -0000
@@ -144,6 +144,7 @@
{ ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL,
BUTTON_NONE },
{ ACTION_PS_RESET, BUTTON_MENU,
BUTTON_NONE },
{ ACTION_PS_EXIT, BUTTON_SELECT,
BUTTON_NONE },
+ { ACTION_PS_PLAY, BUTTON_PLAY,
BUTTON_NONE },
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
}; /* button_context_pitchscreen */