Форум программистов, компьютерный форум, киберфорум
Программирование графики
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8

Ноты на нотоносце. SDL

06.06.2013, 22:30. Показов 1133. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа показывает случайные ноты. Как их рисовать в окне используя SDL?
Вопрос самый первый - можно ли инициализацию окна и слоёв и рисунков сделать в main функции, а процедуру рисования написать в отдельном файле? Как делают подобное?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
//#include <SDL/SDL.h>
 
# define TASK_NOTES {48,50,52,53,55,57,59,60} // C maj
 
int main ( int argc, char** argv )
{
    int CountTaskNote,CurNote,LastNote;
    int TaskNote[]=TASK_NOTES;
    CountTaskNote= sizeof(TaskNote)/4;
 
    printf(" Random notes \n");
 
    while(1)
    {
        do
        {
            CurNote=( rand()%(CountTaskNote));
        }
        while (CurNote==LastNote);
        LastNote=CurNote;
        printf(" %-3d \n",TaskNote[CurNote]);
        
        //DrawNote(TaskNote[CurNote]); //DRAW SDL
 
        Sleep (500);
    }
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.06.2013, 22:30
Ответы с готовыми решениями:

Исспользование .png файлов с прозрачностью (ноты на нотоносце)
Здравствуйте. Планирую создать окно, нарисовать в нём нотоносец (один файл), сверху накладывать в разных местах ноты (другой файл, с...

Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2?
В официальной доке как-то скомкано написано. При инициализации SDL TTF и при загрузке шрифта ошибок нет. Но текст на экране не...

Ноты с электрогитары
Всем доброго времени суток! Не могли бы вы помочь мне в таком вопросе: 1)У меня есть электрогитара и мне нужно захватывать звук с нее....

3
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
09.06.2013, 07:05  [ТС]
Итак. Генерация случайной ноты, исключая повторения. Номер передаётся в процедуру рисования, там из switch выбирается положение по вертикали. Кроме того при ноте 60 рисуется доп. линейка.
Правильно ли сделал? Показывает правильно. Где тут поставить условие на выход из программы по Esc или кнопки закрытия окна?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
 
# define TASK_NOTES {48,50,52,53,55,57,59,60} // C maj
 
SDL_Surface *LINES;
SDL_Surface *LINEADD;
SDL_Surface *NOTE;
SDL_Surface *SCREEN;
SDL_Rect dest;
SDL_Rect destline;
 
void InitImages()
{
 
    LINES=SDL_LoadBMP("NoteLines_600_400.bmp");
    NOTE=SDL_LoadBMP("Note.bmp");
    LINEADD=SDL_LoadBMP("LineAdd.bmp");
 
}
 
void DrawNote(int CurNote)
{
    SDL_BlitSurface(LINES, NULL, SCREEN, NULL);
 
    dest.x = 360;
    switch (CurNote)
    {
    case (48):
    {
        destline.x = 340;
        destline.y = 291;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
        dest.y = 277;
        break;
    }
    case (50):
        dest.y = 258;
        break;
    case (52):
        dest.y = 241;
        break;
    case (53):
        dest.y = 222;
        break;
    case (55):
        dest.y = 204;
        break;
    case (57):
        dest.y = 186;
        break;
    case (59):
        dest.y = 168;
        break;
    case (60):
        dest.y = 151;
        break;
    }
    SDL_BlitSurface(NOTE, NULL, SCREEN, &dest);
    SDL_Flip(SCREEN);
    return ;
}
 
int main ( int argc, char** argv )
{
    int CountTaskNote,CurNote,LastNote;
    int TaskNote[]=TASK_NOTES;
    CountTaskNote= sizeof(TaskNote)/4;
 
    printf(" Random notes \n");
 
    SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO);
 
    atexit(SDL_Quit);
 
    SCREEN = SDL_SetVideoMode(600,400,32, SDL_HWSURFACE|SDL_DOUBLEBUF);
    SDL_WM_SetCaption("C maj","ex1");
 
    InitImages();
 
    while(1)
    {
        do
        {
            CurNote=( rand()%(CountTaskNote));
        }
        while (CurNote==LastNote);
        LastNote=CurNote;
 
        DrawNote(TaskNote[CurNote]); //DRAW SDL
        SDL_Delay(500);
    }
    return 0;
}
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
12.06.2013, 01:55  [ТС]
Для рисования дополнительных линеек сделал отдельную процедуру.
Например, рисование самой нижней ноты:
C
1
2
3
4
case 40:
     DrawAddLines(-3);
     dest.y = 350;
     break;
Оно в свою очередь вызывает процедуру рисования линеек
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void DrawAddLines(int AddLines)
{
    destline.x = 340;
 
    switch (AddLines)
    {
    case -3:
        destline.y = 347;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    case -2:
        destline.y = 317;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    case -1:
        destline.y = 287;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    break;
    case 3:
        destline.y = 20;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    case 2:
        destline.y = 50;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    case 1:
        destline.y = 80;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    }
    return ;
}
Линейка это чёрный .bmp 90*3 пикселей.
Диапазон для рандома выглядит так:
C
1
2
3
4
5
//# define TASK_NOTES {40,41,43,45,47,48} // C maj big
//# define TASK_NOTES {48,50,52,53,55,57,59,60} // C maj small
//# define TASK_NOTES {60,62,64,65,67,69,71,72} // C maj 1
//# define TASK_NOTES {72,74,76} // C maj 2
# define TASK_NOTES {67,69,71,72,74,76} // ноты которые нужно показывать
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
14.06.2013, 01:35  [ТС]
Самый готовый вариант кода. Добавил обработку событий (эскейп и кнопка закрытия окна), все основные ноты (диапазон гитары), выгрузка изображений при завершении работы. Окно можно перемещать, оно не зависает.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
 
//# define TASK_NOTES {40,41,43,45,47,48} // C maj big
//# define TASK_NOTES {48,50,52,53,55,57,59,60} // C maj small
//# define TASK_NOTES {60,62,64,65,67,69,71,72} // C maj 1
//# define TASK_NOTES {72,74,76} // C maj 2
# define TASK_NOTES {40,41,43,45,47,48, 48,50,52,53,55,57,59,60, 62,64,65,67,69,71,72,74,76}
 
SDL_Surface *LINES;
SDL_Surface *LINEADD;
SDL_Surface *NOTE;
SDL_Surface *SCREEN;
SDL_Rect dest;
SDL_Rect destline;
 
 
void DrawAddLines(int AddLines)
{
    destline.x = 340;
 
    switch (AddLines)
    {
    case -3:
        destline.y = 347;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    case -2:
        destline.y = 317;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    case -1:
        destline.y = 287;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
        break;
    case 3:
        destline.y = 20;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    case 2:
        destline.y = 50;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    case 1:
        destline.y = 80;
        SDL_BlitSurface(LINEADD, NULL, SCREEN, &destline);
    }
    return ;
}
 
 
void DrawNote(int CurNote)
{
    SDL_BlitSurface(LINES, NULL, SCREEN, NULL);
 
    dest.x = 360;
    switch (CurNote)
    {
        // 40,41,43,45,47,48  C maj big
    case 40:
        DrawAddLines(-3);
        dest.y = 350;
        break;
    case 41:
        DrawAddLines(-3);
        dest.y = 334;
        break;
    case 43:
        DrawAddLines(-2);
        dest.y = 320;
        break;
    case 45:
        DrawAddLines(-2);
        dest.y = 304;
        break;
    case 47:
        DrawAddLines(-1);
        dest.y = 290;
        break;
 
        //48,50,52,53,55,57,59,60  C maj small
    case 48:
        DrawAddLines(-1);
        dest.y = 274;
        break;
    case 50:
        dest.y = 258;
        break;
    case 52:
        dest.y = 241;
        break;
    case 53:
        dest.y = 222;
        break;
    case 55:
        dest.y = 204;
        break;
    case 57:
        dest.y = 186;
        break;
    case 59:
        dest.y = 168;
        break;
        // 60,62,64,65,67,69,71,72 C maj 1
    case 60:
        dest.y = 151;
        break;
    case 62:
        dest.y = 134;
        break;
    case 64:
        dest.y = 115;
        break;
    case 65:
        dest.y = 98;
        break;
    case 67:
        dest.y = 80;
        break;
    case 69:
        DrawAddLines(1);
        dest.y = 66;
        break;
    case 71:
        DrawAddLines(1);
        dest.y = 48;
        break;
 
        // 72,74,76 // C maj 2
    case 72:
        DrawAddLines(2);
        dest.y = 35;
        break;
    case 74:
        DrawAddLines(2);
        dest.y = 18;
        break;
    case 76:
        DrawAddLines(3);
        dest.y = 5;
        break;
    }
 
    SDL_BlitSurface(NOTE, NULL, SCREEN, &dest);
    SDL_Flip(SCREEN);
    return ;
}
 
int main ( int argc, char** argv )
{
    int CountTaskNote,CurNote,LastNote;
    int TaskNote[]=TASK_NOTES;
    CountTaskNote= sizeof(TaskNote)/4;
 
    printf(" Random notes \n");
 
    // initialize SDL video
    SDL_Init(SDL_INIT_VIDEO);
    // make sure SDL cleans up before exit
    atexit(SDL_Quit);
    // create a new window
    SCREEN = SDL_SetVideoMode(600,400,32, SDL_HWSURFACE|SDL_DOUBLEBUF);
    SDL_WM_SetCaption("C maj","ex1");
 
    // load images
    LINES=SDL_LoadBMP("NoteLines_600_400.bmp");
    NOTE=SDL_LoadBMP("Note.bmp");
    LINEADD=SDL_LoadBMP("LineAdd.bmp");
 
 
    // ##########################################
    // program main loop
    int done=0;
    while(done==0)
    {
        // message processing loop
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            // check for messages
            switch (event.type)
            {
            case SDL_QUIT:
                done = 1;
                break;
            case SDL_KEYDOWN:
            {
                if (event.key.keysym.sym == SDLK_ESCAPE)
                    done = 1;
                break;
            }
 
            }// end switch
        }// end of message processing
 
        // ##########################################
        // GENERATE AND DRAWING
 
        do
        {
            CurNote=( rand()%(CountTaskNote));
        }
        while (CurNote==LastNote);
        LastNote=CurNote;
 
        DrawNote(TaskNote[CurNote]); //DRAW SDL
        SDL_Delay(800);
 
    }// end main loop
 
// free loaded bitmap
    SDL_FreeSurface(LINES);
    SDL_FreeSurface(LINEADD);
    SDL_FreeSurface(NOTE);
 
// all is well
    printf("Exited cleanly\n");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.06.2013, 01:35
Помогаю со студенческими работами здесь

Музыкальные ноты
Привет, форумчане. Наверняка каждый знает про такое замечательное устройство, принципа музыкальной шкатулки. Это такой &quot;ящичек&quot; с...

Определение частоты ноты
Задача из второй недели CS50. Описывать смысл задания на русском очень долго и муторно, потому просто оставлю ссылку:...

MIDI, ноты и мобильник
Подскажите, пожалуйста, ответ на два вопроса: 1) Есть MIDI файл с песней. Какой программой можно преобразовать его в ноты, которые потом...

Как преобразовать звук в ноты
Вообщем так, мне нужно преобразоваться игру на гитаре в ноты. есть ли такие программы? вот например гитар про, в ней не работал поэтому не...

Преобразование midi файла в ноты
Не знаю как преобразовать midi в ноты, кто нибудь сталкивался с подобной проблемой?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru