본문 바로가기
개발일지/기타

[QT] QT creator - 간단 작곡 코드 생성 프로그램 만들기(C++) - 3

by 라이티아 2024. 5. 20.

현재 듣고있는곡 - oneself

특유의 랩하는 듯한 보컬로이드 노래이다, 충분히 가능성이 많은 노래지만, 아는 분이 적어서 아쉬운 노래이다

 

 

 

 

 

 

이제 악보 칸에 6선보를 넣고, 멜로디에 맞게 음표를 넣어줄 것이다

 

포토샵으로 대충 5선보를 크기에 맞게 만들어준다

 

그후 코드를 넣어서 사진을 label에 넣어준다

잘 들어갔다

 

갑자기 비활성 버튼에 효과를 주고 싶어졌다

QString disabledStyle = "QPushButton:disabled { background-color: lightgray; color: darkgray; }";

 

string으로 문자열에 원하는 색상을 저장한다

 

ui->pushButton_2->setStyleSheet(disabledStyle);
ui->pushButton_3->setStyleSheet(disabledStyle);

그후 버튼에 비활성시 어떻게 보일지 설정한다

 

이제 비활성 버튼은 회색으로 보인다

 

 

 

 

이제 음표를 어떻게 넣을지 생각해야 한다

 

일단 머리속에서는 이미지를 좌표설정해버리면 되지 않을까 생각한다

생각났으니 그냥 해보자

 

이앞 그저 하드코딩

 

엄청나게 작은 4분1박 음표를 만들고

 

ui->s1->setPixmap(s);

 

이미지를 넣어준다

 

의외로 할만하다?

 

이미지도 바꿔서 만들어보자

좀 더 깔끔한 형태로 만들었다

 

좀 더 나은 것 같다

이제 이걸 멜로디 생성을 누르면 좌표에 맞게 나오도록 설정하자

 

온세상이 하드코딩이다

 

크아아악

 

for루프 돌리고 싶은데 돌릴수가 없다

 

이제 멜로디 버튼을 누르면 적절히 움직이도록 만들자

 

이 멜로디 덩어리에 적절히 배치하기 위해서 함수를 작성한다

 

함수는 char을 받아서 int로 반환하며, 반환값으로 음표 UI위치를 결정할 것이다

 

int s_move_for_first(char code){
    if('C'){
        int i = rand() % 2 + 1;
        if(i == 1)
            return 220;
        else
            return 164;
    }
    if('D')
        return 212;
    if('E')
        return 204;
    if('F')
        return 196;
    if('G')
        return 188;
    if('A')
        return 180;
    if('B')
        return 172;

    return 0;
}

 

이렇게 위치를 짜준다

 

이제 이 함수로 좌표를 계산하고 y값은 고정시켜서 move를 해준다

이렇게 해주면 된다

 

아 x좌표로 했네;;

 

y기준으로 다시 작성한다

맞긴한데 실수를 했다

make_chord함수는 항상 랜덤한 값을 만든다

 

즉, 이 그림은 랜덤하게 만들어 진 악보이다

 

이를 해결하기 위해서 버튼 이벤트 안에서 char변수를 만들어서 저장하도록 만들자


char melody[16];
    
melody [0] = make_chord(code[0]);
melody [1] = make_chord(code[0]);
melody [2] = make_chord(code[0]);
melody [3] = make_chord(code[0]);

 

이렇게 하면 변수가 저장되어서 남아있다

 

그럼 이런식으로 코드를 짜줄 수 있게된다

 

나머지는 그저 하드코딩

 

으아아아아!!!!

 

2번 악보와 1번 악보 좌표가 겹친다

 

이제 y에 +를 일정값 줘버리면 돌아올 것이다

 

 

그리고 지금 보니 함수도 잘못되어 있다

int s_move_for_first(char code){
    if('C'){
        int i = rand() % 2 + 1;
        if(i == 1)
            return 220;
        else
            return 164;
    }
    if('D')
        return 212;
    if('E')
        return 204;
    if('F')
        return 196;
    if('G')
        return 188;
    if('A')
        return 180;
    if('B')
        return 172;

    return 0;
}

 

if문에 char로 가져온 매개변수를 넣어줘야 한다

 

if(code == 'C'){
        int i = rand() % 2 + 1;
        if(i == 1)
            return 220;
        else
            return 164;
    }


이렇게 말이다

 


    ui->C4_1->setText(QString(melody[16]));
    ui->C4_2->setText(QString(melody[17]));
    ui->C4_3->setText(QString(melody[18]));
    ui->C4_4->setText(QString(melody[19]));
    ui->s5_1->move(50,s_move_for_first(melody[16])+260);
    ui->s5_2->move(80,s_move_for_first(melody[17])+260);
    ui->s5_3->move(110,s_move_for_first(melody[18])+260);
    ui->s5_4->move(140,s_move_for_first(melody[19])+260);

 

2번 5선보의 표시에 어느정도 오차를 +해준다

 

 

일단 되기는 한다

근데 2번 5선보가 약간 오차가 있다

 

수정해 주자

 

 

전체적으로 보정값에 문제가 있어서 재수정했다

 

전체적으로 완성되었다

 

나중에 기회가 된다면 멜로디에 맞춰서 보컬로이드 미쿠로 음계 소리가 나게 만들 계획이다

 

 

 

 

 

 

 

GitHub - NoNamed02/Easy_composition-VC: 간단 작곡 프로그램 프로젝트

간단 작곡 프로그램 프로젝트. Contribute to NoNamed02/Easy_composition-VC development by creating an account on GitHub.

github.com