Rockbox.org home
release
dev builds
extras
themes manual
wiki
device status forums
mailing lists
IRC bugs
patches
dev guide



Rockbox mail archive

Subject: My first patch [to use halftones for pitch shifting]

My first patch [to use halftones for pitch shifting]

From: Alessandro Polselli <alessandro.polselli_at_gmail.com>
Date: Sat, 9 Sep 2006 02:13:37 +0200

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 */
Received on 2006-09-09


Page was last modified "Jan 10 2012" The Rockbox Crew
aaa