void part3_ex3_audio_waveform(void)
{
lv_obj_t *scr = lv_screen_active();
lv_obj_set_style_bg_color(scr, lv_color_hex(0x0a0a1e), 0);
/* ===== Title ===== */
lv_obj_t *title = lv_label_create(scr);
lv_label_set_text(title, "Part 3 Ex3: Audio Waveform & Harmonics");
lv_obj_set_style_text_color(title, lv_color_hex(0x00ff88), 0);
lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 5);
/* ===== Waveform Chart ===== */
audio_chart = lv_chart_create(scr);
lv_obj_set_size(audio_chart, 400, 130);
lv_obj_align(audio_chart, LV_ALIGN_TOP_MID, 0, 28);
lv_chart_set_type(audio_chart, LV_CHART_TYPE_LINE);
lv_chart_set_point_count(audio_chart, DISPLAY_POINTS);
lv_chart_set_range(audio_chart, LV_CHART_AXIS_PRIMARY_Y, 0, 100);
lv_chart_set_div_line_count(audio_chart, 4, 5);
lv_obj_set_style_bg_color(audio_chart, lv_color_hex(0x001a00), 0);
lv_obj_set_style_line_color(audio_chart, lv_color_hex(0x003300),
LV_PART_MAIN);
lv_obj_set_style_border_color(audio_chart, lv_color_hex(0x006600), 0);
lv_obj_set_style_border_width(audio_chart, 1, 0);
lv_obj_set_style_size(audio_chart, 0, 0, LV_PART_INDICATOR);
audio_series = lv_chart_add_series(audio_chart,
lv_color_hex(0x00ff00), LV_CHART_AXIS_PRIMARY_Y);
/* ===== Piano Key Buttons ===== */
/* Container สำหรับปุ่มโน้ต */
lv_obj_t *key_cont = lv_obj_create(scr);
lv_obj_set_size(key_cont, 400, 45);
lv_obj_align(key_cont, LV_ALIGN_CENTER, 0, 20);
lv_obj_set_style_bg_opa(key_cont, LV_OPA_TRANSP, 0);
lv_obj_set_style_border_width(key_cont, 0, 0);
lv_obj_set_style_pad_all(key_cont, 2, 0);
lv_obj_set_flex_flow(key_cont, LV_FLEX_FLOW_ROW);
lv_obj_set_flex_align(key_cont, LV_FLEX_ALIGN_SPACE_EVENLY,
LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
lv_obj_remove_flag(key_cont, LV_OBJ_FLAG_SCROLLABLE);
const char *key_labels[] = {"C", "D", "E", "F", "G", "A", "B"};
for (int i = 0; i < NUM_NOTES; i++) {
lv_obj_t *btn = lv_btn_create(key_cont);
lv_obj_set_size(btn, 48, 35);
lv_obj_set_style_bg_color(btn, lv_color_hex(0x333355), 0);
lv_obj_set_style_radius(btn, 4, 0);
lv_obj_set_user_data(btn, (void*)(uintptr_t)i);
lv_obj_add_event_cb(btn, note_btn_cb, LV_EVENT_CLICKED, NULL);
lv_obj_t *lbl = lv_label_create(btn);
lv_label_set_text(lbl, key_labels[i]);
lv_obj_center(lbl);
/* Highlight A4 (default) */
if (i == 5) {
lv_obj_set_style_bg_color(btn, lv_color_hex(0x00aa66), 0);
}
}
/* ===== Harmonic Sliders ===== */
/* 2nd Harmonic */
lv_obj_t *h2_title = lv_label_create(scr);
lv_label_set_text(h2_title, "2nd Harm:");
lv_obj_set_style_text_color(h2_title, lv_color_hex(0xaaaaaa), 0);
lv_obj_align(h2_title, LV_ALIGN_BOTTOM_LEFT, 10, -45);
lv_obj_t *h2_slider = lv_slider_create(scr);
lv_slider_set_range(h2_slider, 0, 100);
lv_slider_set_value(h2_slider, 0, LV_ANIM_OFF);
lv_obj_set_width(h2_slider, 160);
lv_obj_align(h2_slider, LV_ALIGN_BOTTOM_LEFT, 100, -45);
lv_obj_add_event_cb(h2_slider, harm2_slider_cb,
LV_EVENT_VALUE_CHANGED, NULL);
harm2_label = lv_label_create(scr);
lv_label_set_text(harm2_label, "2nd: 0%");
lv_obj_set_style_text_color(harm2_label, lv_color_hex(0xffaa00), 0);
lv_obj_align(harm2_label, LV_ALIGN_BOTTOM_LEFT, 270, -45);
/* 3rd Harmonic */
lv_obj_t *h3_title = lv_label_create(scr);
lv_label_set_text(h3_title, "3rd Harm:");
lv_obj_set_style_text_color(h3_title, lv_color_hex(0xaaaaaa), 0);
lv_obj_align(h3_title, LV_ALIGN_BOTTOM_LEFT, 10, -20);
lv_obj_t *h3_slider = lv_slider_create(scr);
lv_slider_set_range(h3_slider, 0, 100);
lv_slider_set_value(h3_slider, 0, LV_ANIM_OFF);
lv_obj_set_width(h3_slider, 160);
lv_obj_align(h3_slider, LV_ALIGN_BOTTOM_LEFT, 100, -20);
lv_obj_add_event_cb(h3_slider, harm3_slider_cb,
LV_EVENT_VALUE_CHANGED, NULL);
harm3_label = lv_label_create(scr);
lv_label_set_text(harm3_label, "3rd: 0%");
lv_obj_set_style_text_color(harm3_label, lv_color_hex(0xff6600), 0);
lv_obj_align(harm3_label, LV_ALIGN_BOTTOM_LEFT, 270, -20);
/* ===== Note Info Label ===== */
note_label = lv_label_create(scr);
lv_obj_set_style_text_color(note_label, lv_color_hex(0x00ffff), 0);
lv_obj_set_style_text_font(note_label, &lv_font_montserrat_16, 0);
lv_obj_align(note_label, LV_ALIGN_BOTTOM_RIGHT, -15, -45);
/* แสดง waveform แรก (A4 pure sine) */
update_waveform_display();
}