10/14:
居然有人來看,解釋一下這是什麼鬼好了。

基本上這是一個跟音樂/樂理有關的超簡陋小程式,
大家都知道的DoReMiFa...Si就是C D E F G A B,
那C的向上完全五度是G,向下完全五度是F(因為F -> G -> A -> B -C)
那B的向上完全五度是什麼? 正確答案是F#
 (如果不懂的話看一下鋼琴鍵盤,完全五度是7個半音
所以B#的上完全五度就是F##)

這個程式會隨機出題,要你回答某個音的向上完全五度是什麼這樣。
(當然你也可以選完全四度的考題,不過我還懶得去寫混合考題的功能)

要連續答對一定的題數就會結束程式了。
不過有下面這段程式碼也沒辦法直接執行,因為它是用Ruby寫的。
過些日子想辦法把轉好的程式丟上來吧。就醬。

update:
1. 增加了Perfect 4th的功能
2. 把沒意義的元素修掉一點了

bug:
1. 問題數&問題類形 這兩題答錯就會跳出程式

future function:
1. 先GUI化吧
2.把bug修掉
3. 其它音程(大小三度next)


#interval testing program v.0.3.1
#written by juls
#                    00         01      02        03         04     05         06        07      08        09         10
keys = ['Bb','B','B#','Cb','C','C#','Db','D','D#','Eb',
        'E', 'E#','Fb','F','F#','Gb','G','G#','Ab','A','A#']

extraKeys = keys + ['F##','Bbb']


rightAns = 0
answer = 'a'
puts 'How many questions would you like to do? '
puts 'a. 5 questions'
puts 'b. 12 questions'
puts 'c. 24 questions'
role = gets.chomp.downcase

if role == 'a'
rolenum = 5
elsif role == 'b'
rolenum = 12
elsif role == 'c'
rolenum = 24
#else
end

intervalArray = ['Major and minor 2nd','Major & minor 3rd',
                 'Perfect 4th','Prefect 5th','Major and minor 6th',
                 'Major and minor 7th']

puts "Perfect 5th & Perfect 4th test is Available now."
puts "Which interval test would you like to do?"
puts "(please input number 5 or 4)"
interval = gets.chomp.to_i
intervalName = intervalArray[(interval-2)]

while rightAns < rolenum and answer.upcase != 'Q'
keyRandNum = rand(21)
keyRand = keys[keyRandNum]
udArray = ['above','below']
udRandNum = rand(2)
udRand = udArray[udRandNum]

    if interval == 5
    soundNumClac = ((21*udRandNum - (interval-1)*3).abs + keyRandNum)
    puts ''

        if    udRandNum == 0 and keyRandNum == 0
        soundNum = (soundNumClac - 1)%21
           
        elsif udRandNum == 0 and keyRandNum == 1
        soundNum = (soundNumClac - 1)%21
             
        elsif udRandNum == 0 and keyRandNum == 2
        keys = extraKeys
        soundNum = 21
               
        elsif udRandNum == 1 and keyRandNum == 12
        keys = extraKeys
        soundNum = 22
               
        elsif udRandNum == 1 and keyRandNum == 13
        soundNum = (soundNumClac - 1)%21
       
        elsif udRandNum == 1 and keyRandNum == 14
        soundNum = (soundNumClac - 1)%21

        else
        soundNum = soundNumClac%21
        end

    elsif interval == 4

        soundNumClac = ((21*udRandNum - (interval-1)*3).abs + keyRandNum)
        puts ''    

            if    udRandNum == 0 and keyRandNum == 12
            keys = extraKeys
            soundNum = 22
           
            elsif udRandNum == 0 and keyRandNum == 13
            soundNum = (soundNumClac - 1)%21
                 
            elsif udRandNum == 0 and keyRandNum == 14
            soundNum = (soundNumClac - 1)%21
                   
            elsif udRandNum == 1 and keyRandNum == 0
            soundNum = (soundNumClac + 1)%21
           
            elsif udRandNum == 1 and keyRandNum == 1
            soundNum = (soundNumClac + 1)%21
           
            elsif udRandNum == 1 and keyRandNum == 2
            keys = extraKeys
            soundNum = 21
           
            else
            soundNum = soundNumClac%21
            end
           
        correctNote = keys [soundNum]   

        puts ''
        puts ''
        puts 'What is the ' + intervalName + ' ' + udRand + ' the key ' + keyRand + ' ?'
        puts '(Enter [Q] to quit the test.)'

        answer = gets.chomp

        if answer.upcase == 'Q'
           STDOUT.flush
           puts 'Goodbye!'
           
        else

            if answer.upcase == correctNote.upcase
            rightAns = rightAns + 1
             if rightAns <= 1
             point = 'point'
             else
             point = 'points'
             end
            puts 'Correct! Your got ' + rightAns.to_s + ' ' + point +' now.'
           
            else
            puts ''
            puts 'Nooop, The Correct answer is "' + correctNote + '"'
            puts 'Sorry, your score have back to ZERO. >_<'
            rightAns = 0
            end
        end
    end
end

if rightAns == rolenum
puts 'Congradulation! You have pass the test!! ^___^'   
end


arrow
arrow
    全站熱搜

    juls 發表在 痞客邦 留言(1) 人氣()