Using a Character LCD to display Graphs / Animations

Just came across this video on youtube:

And was thinking it would be a cool feature to add to current midiboxes,

for instance having a fancier parameter meter display, (like the one in mb-6582)

I’m guessing that it would be more suited to MIDIbox SID v3, because of memory restrictions however.

How would this be done on midibox?

I’d imagine you must modify for the LCD driver, to be able to control pixels individually?

Or maybe you need to create new characters to do this, and it involves scrolling through each character?

Hi.

The MIDIbox_SEQ_V4 uses a similar feature for an animated logo display on startup.

Character LCD’s have 8 user definable characters which is why you will notice that no more than 8 different special characters are displayed on screen at the same time. In fact all of the standard MIDIbox fonts already have the ‘bargraph’ characters defined so a simple “spectrum analyzer” display (like in the second half of the video) can be quite easily achieved.

With a bit of creativity you can do some quite impressive effects but for full ‘pixel’ level control you really need a graphical LCD!

Cheers

Phil

Hi.

The MIDIbox_SEQ_V4 uses a similar feature for an animated logo display on startup.

I just spotted this in the mb-seq video! D’oh!

Character LCD’s have 8 user definable characters which is why you will notice that no more than 8 different special characters are displayed on screen at the same time. In fact all of the standard MIDIbox fonts already have the ‘bargraph’ characters defined so a simple “spectrum analyzer” display (like in the second half of the video) can be quite easily achieved.

With a bit of creativity you can do some quite impressive effects but for full ‘pixel’ level control you really need a graphical LCD!

Cheers

Phil

Thanks a lot for the explanation phil!

The kaffeSEQ has an animated logo as well. Fun stuff :slight_smile:

8 characters can be a lot if used wisely.

nice!

I’d like to put a little logo at the init time.

how could I do that?

I mean, as LCD are refreshed and displayed with ISR functions, should I addressed things inside init() ? or elsewhere, when init() is done ?

I wrote a little function that gets called by Init(). This function simply displays one frame, then waits a little, displays the next, …

I wrote a little function that gets called by Init(). This function simply displays one frame, then waits a little, displays the next, …

and may I have the chance to check this little function?

Sure.

const unsigned char custom_chars_logo[8*8] = {
0x10, 0x10, 0x10, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, // bottom left
0x0B, 0x0B, 0x0B, 0x1B, 0x1E, 0x18, 0x18, 0x10, // bottom right
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0E, // top right
0x01, 0x02, 0x08, 0x04, 0x08, 0x00, 0x1F, 0x10, // top left 1/3
0x08, 0x10, 0x08, 0x02, 0x04, 0x02, 0x1F, 0x10, // top left 2/3
0x08, 0x02, 0x01, 0x02, 0x08, 0x10, 0x1F, 0x10, // top left 3/3
0x08, 0x02, 0x01, 0x02, 0x08, 0x10, 0x1F, 0x10,
0x08, 0x02, 0x01, 0x02, 0x08, 0x10, 0x1F, 0x10
};

#define bl 0
#define br 1
#define tr 2
#define tl1 3
#define tl2 4
#define tl3 5

// define the LCD cursor positions (important if you use displays other than
// 2x8)
#define LCD_LINE1_ADDR 0
#define LCD_LINE2_ADDR 40

#define LCD_Line1	MIOS_LCD_CursorSet(LCD_LINE1_ADDR);
#define LCD_Line2	MIOS_LCD_CursorSet(LCD_LINE2_ADDR);

// pointless but oh well :-)
void UI_animatedLogo() {
char* line1 = APP_NAME;
char* line2 = APP_VERSION;

s8 n;
s8 m;

#ifdef QUICK_BOOT
#define DELAY1 0
#define DELAY2 0
#else
#define DELAY1 64
#define DELAY2 255
#endif

MIOS_LCD_Clear();

LCD_Line1;
MIOS_LCD_PrintChar(tl1);
MIOS_LCD_PrintChar(tr);
MIOS_LCD_PrintCString(" kaffe");
LCD_Line2;
MIOS_LCD_PrintChar(bl);
MIOS_LCD_PrintChar(br);
MIOS_LCD_PrintCString(" SEQ");

for (n=0; n<8; n++) {
for (m=0; m<3; m++) {
LCD_Line1;
MIOS_Delay(DELAY2);
MIOS_LCD_PrintChar(tl1+m);
}
}
}
[/code]

Sure.

const unsigned char custom_chars_logo[8*8] = {

0x10, 0x10, 0x10, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, // bottom left

0x0B, 0x0B, 0x0B, 0x1B, 0x1E, 0x18, 0x18, 0x10, // bottom right

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0E, // top right

0x01, 0x02, 0x08, 0x04, 0x08, 0x00, 0x1F, 0x10, // top left 1/3

0x08, 0x10, 0x08, 0x02, 0x04, 0x02, 0x1F, 0x10, // top left 2/3

0x08, 0x02, 0x01, 0x02, 0x08, 0x10, 0x1F, 0x10, // top left 3/3

0x08, 0x02, 0x01, 0x02, 0x08, 0x10, 0x1F, 0x10,

0x08, 0x02, 0x01, 0x02, 0x08, 0x10, 0x1F, 0x10

};

#define bl 0

#define br 1

#define tr 2

#define tl1 3

#define tl2 4

#define tl3 5

// define the LCD cursor positions (important if you use displays other than

// 2x8)

#define LCD_LINE1_ADDR 0

#define LCD_LINE2_ADDR 40

#define LCD_Line1 MIOS_LCD_CursorSet(LCD_LINE1_ADDR);

#define LCD_Line2 MIOS_LCD_CursorSet(LCD_LINE2_ADDR);

// pointless but oh well :slight_smile:

void UI_animatedLogo() {

char* line1 = APP_NAME;

char* line2 = APP_VERSION;

s8 n;

s8 m;

#ifdef QUICK_BOOT

#define DELAY1 0

#define DELAY2 0

#else

#define DELAY1 64

#define DELAY2 255

#endif

MIOS_LCD_Clear();

LCD_Line1;

MIOS_LCD_PrintChar(tl1);

MIOS_LCD_PrintChar(tr);

MIOS_LCD_PrintCString(" kaffe");

LCD_Line2;

MIOS_LCD_PrintChar(bl);

MIOS_LCD_PrintChar(br);

MIOS_LCD_PrintCString(" SEQ");

for (n=0; n<8; n++) {

for (m=0; m<3; m++) {

LCD_Line1;

MIOS_Delay(DELAY2);

MIOS_LCD_PrintChar(tl1+m);

}

}

}

is it for core32?

No.

No.

ok.

I replaced s8 by unsigned int cause I had a compilation error.

My LCD is 2x20

should I define something somewhere with MIOS_LCD_YAddressSet and/or MIOS_LCD_TypeSet ?

Didnt spot the Kaffe logo reply the last time round.

And on a seq-related note,

you can haz finish this project plz? :wink:

An MB Midi Looper, would be sweet, if anyone wants to make one!

I cant really find any dedicated midi loopers/loop pedals out there.

s8 = signed char

u8 = unsigned char

s16 = signed int

u16 = unsigned int

I have those declared in some .h :slight_smile:

Many of the “Noritake Itron” VFD displays (like the one in the video above) include characters that can be arranged to make a horizontal bar-graph display, without the need for “custom characters”.

I have a Left & Right growing from center type of level meter in the MBMixer software, even though it’s not supported by all display types.

It’s written in PIC ASM.. available on request.

LyleHaze

U iz 2 slow, so i buyz RS7000 insted,

kthxbai.

:wink: