// File: Wombozo[P]harmony/src/Chord.cpp
// Function: Chord::Chord(Note*, std::vector<Interval, std::allocator<Interval>>)
Chord::Chord(Note *n, std::vector<Interval> ints) : root(n), bass(n), inversion(0)
{
    if (ints.size() != 2 && ints.size() != 3)
        throw E_CHORD_UNKNOWN;
    t = new Triad(n, ints);
    if (ints.size() == 2)
    {
        name = t->getName();
        notes = t->notes;
        intervals = t->getIntervals();
    }
    else
    {
        std::string str;
        Interval int4 = ints.at(2);
        intervals = ints;
        notes = t->notes;
        if (!int4.getName().compare("minor seventh"))
        {
            notes.push_back(int4.getNextSorted(root));
            if (!t->getTypeName().compare(""))
            {
                // 7
                str = chords[0];
            }
            else if (!t->getTypeName().compare("m"))
            {
                // m7
                str = chords[3];
            }
            else if (!t->getTypeName().compare("dim"))
            {
                // m7b5
                str = chords[6];
            }
            else
                throw E_CHORD_UNKNOWN;
        }
        else if (!int4.getName().compare("major seventh"))
        {
            notes.push_back(int4.getNextSorted(root));
            if (!t->getTypeName().compare(""))
            {
                // maj7
                str = chords[1];
            }
            else if (!t->getTypeName().compare("m"))
            {
                // minmaj7
                str = chords[4];
            }
            else if (!t->getTypeName().compare("dim"))
            {
                // 7b5
                str = chords[7];
            }
            else
                throw E_CHORD_UNKNOWN;
        }
        else if (!int4.getName().compare("major sixth"))
        {
            notes.push_back(int4.getNextSorted(root));
            if (!t->getTypeName().compare("m"))
            {
                // m6
                str = chords[5];
            }
            else if (!t->getTypeName().compare(""))
            {
                // 6
                str = chords[2];
            }
            else
                throw E_CHORD_UNKNOWN;
        }
        else if (!int4.getName().compare("diminished seventh"))
        {
            notes.push_back(int4.getNextSorted(root));
            if (!t->getTypeName().compare("dim"))
            {
                //dim7
                str = chords[8];
            }
            else
                throw E_CHORD_UNKNOWN;
        }
        else
            throw E_CHORD_UNKNOWN;
        name = n->display() + str;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x380, %rsp            # imm = 0x380
movq %rdx, -0x2d0(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x2e0(%rbp)
movq -0x10(%rbp), %rax
movq %rax, (%rdi)
movq -0x10(%rbp), %rax
movq %rax, 0x10(%rdi)
movl $0x0, 0x18(%rdi)
addq $0x20, %rdi
movq %rdi, -0x2f0(%rbp)
callq 0x3300
movq -0x2e0(%rbp), %rdi
addq $0x40, %rdi
movq %rdi, -0x2e8(%rbp)
callq 0xf520
movq -0x2e0(%rbp), %rdi
addq $0x58, %rdi
movq %rdi, -0x2d8(%rbp)
callq 0x72c0
movq -0x2d0(%rbp), %rdi
callq 0xf540
cmpq $0x2, %rax
je 0xe73a
movq -0x2d0(%rbp), %rdi
callq 0xf540
cmpq $0x3, %rax
je 0xe73a
movl $0x4, %edi
callq 0x3140
movq %rax, %rdi
movl $0x1, (%rdi)
leaq 0x1211d(%rip), %rsi     # 0x20838
xorl %eax, %eax
movl %eax, %edx
callq 0x33a0
jmp 0xf12b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
jmp 0xf0fe
movl $0x88, %edi
callq 0x3230
movq %rax, -0x2f8(%rbp)
jmp 0xe74d
movq -0x2d0(%rbp), %rsi
movb $0x1, -0x41(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x300(%rbp)
leaq -0x40(%rbp), %rdi
callq 0xf570
jmp 0xe76e
movq -0x300(%rbp), %rsi
movq -0x2f8(%rbp), %rdi
leaq -0x40(%rbp), %rdx
callq 0x14f00
jmp 0xe787
movq -0x2e0(%rbp), %rax
movq -0x2f8(%rbp), %rcx
movb $0x0, -0x41(%rbp)
movq %rcx, 0x8(%rax)
leaq -0x40(%rbp), %rdi
callq 0xf660
movq -0x2d0(%rbp), %rdi
callq 0xf540
cmpq $0x2, %rax
jne 0xe88c
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x68(%rbp), %rdi
callq 0x15e00
jmp 0xe7d2
movq -0x2e0(%rbp), %rdi
addq $0x20, %rdi
leaq -0x68(%rbp), %rsi
movq %rsi, -0x308(%rbp)
callq 0x32a0
movq -0x308(%rbp), %rdi
callq 0x3190
movq -0x2e0(%rbp), %rdi
movq 0x8(%rdi), %rsi
addq $0x70, %rsi
addq $0x58, %rdi
callq 0xf6c0
jmp 0xe813
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x80(%rbp), %rdi
callq 0x15e70
jmp 0xe829
movq -0x2e0(%rbp), %rdi
addq $0x40, %rdi
leaq -0x80(%rbp), %rsi
callq 0xf910
leaq -0x80(%rbp), %rdi
callq 0xf660
jmp 0xf0f5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
jmp 0xe86e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
leaq -0x40(%rbp), %rdi
callq 0xf660
testb $0x1, -0x41(%rbp)
jne 0xe876
jmp 0xe887
movq -0x2f8(%rbp), %rdi
movl $0x88, %esi
callq 0x3240
jmp 0xf0fe
leaq -0xa0(%rbp), %rdi
callq 0x3300
movq -0x2d0(%rbp), %rdi
movl $0x2, %esi
callq 0xf940
movq %rax, -0x310(%rbp)
jmp 0xe8b2
movq -0x310(%rbp), %rsi
leaq -0xc8(%rbp), %rdi
callq 0xf980
jmp 0xe8c7
movq -0x2d0(%rbp), %rsi
movq -0x2e0(%rbp), %rdi
addq $0x40, %rdi
callq 0xf9c0
jmp 0xe8e0
movq -0x2e0(%rbp), %rdi
movq 0x8(%rdi), %rsi
addq $0x70, %rsi
addq $0x58, %rdi
callq 0xf6c0
jmp 0xe8fa
leaq -0xe8(%rbp), %rdi
leaq -0xc8(%rbp), %rsi
callq 0xc9b0
jmp 0xe90f
leaq -0xe8(%rbp), %rdi
leaq 0xa9a9(%rip), %rsi      # 0x192c6
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x311(%rbp)
leaq -0xe8(%rbp), %rdi
callq 0x3190
movb -0x311(%rbp), %al
testb $0x1, %al
jne 0xe94b
jmp 0xeb2f
movq -0x2e0(%rbp), %rax
movq %rax, %rcx
addq $0x58, %rcx
movq %rcx, -0x328(%rbp)
movq (%rax), %rsi
leaq -0xc8(%rbp), %rdi
callq 0xbf20
movq %rax, -0x320(%rbp)
jmp 0xe978
movq -0x328(%rbp), %rdi
movq -0x320(%rbp), %rax
movq %rax, -0xf0(%rbp)
leaq -0xf0(%rbp), %rsi
callq 0xfc10
jmp 0xe99b
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x110(%rbp), %rdi
callq 0x15ec0
jmp 0xe9b4
leaq -0x110(%rbp), %rdi
leaq 0xabe0(%rip), %rsi      # 0x195a2
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x329(%rbp)
leaq -0x110(%rbp), %rdi
callq 0x3190
movb -0x329(%rbp), %al
testb $0x1, %al
jne 0xe9ed
jmp 0xea29
leaq 0x129cc(%rip), %rsi     # 0x213c0
leaq -0xa0(%rbp), %rdi
callq 0x3050
jmp 0xea02
jmp 0xeb2a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
jmp 0xf0e7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
jmp 0xf0db
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x130(%rbp), %rdi
callq 0x15ec0
jmp 0xea42
leaq -0x130(%rbp), %rdi
leaq 0xa8a2(%rip), %rsi      # 0x192f2
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x32a(%rbp)
leaq -0x130(%rbp), %rdi
callq 0x3190
movb -0x32a(%rbp), %al
testb $0x1, %al
jne 0xea7b
jmp 0xea95
leaq 0x1299e(%rip), %rsi     # 0x21420
leaq -0xa0(%rbp), %rdi
callq 0x3050
jmp 0xea90
jmp 0xeb28
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x150(%rbp), %rdi
callq 0x15ec0
jmp 0xeaae
leaq -0x150(%rbp), %rdi
leaq 0xa834(%rip), %rsi      # 0x192f0
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x32b(%rbp)
leaq -0x150(%rbp), %rdi
callq 0x3190
movb -0x32b(%rbp), %al
testb $0x1, %al
jne 0xeae7
jmp 0xeafe
leaq 0x12992(%rip), %rsi     # 0x21480
leaq -0xa0(%rbp), %rdi
callq 0x3050
jmp 0xeafc
jmp 0xeb26
movl $0x4, %edi
callq 0x3140
movq %rax, %rdi
movl $0x1, (%rdi)
leaq 0x11d20(%rip), %rsi     # 0x20838
xorl %eax, %eax
movl %eax, %edx
callq 0x33a0
jmp 0xf12b
jmp 0xeb28
jmp 0xeb2a
jmp 0xf049
leaq -0x170(%rbp), %rdi
leaq -0xc8(%rbp), %rsi
callq 0xc9b0
jmp 0xeb44
leaq -0x170(%rbp), %rdi
leaq 0xa782(%rip), %rsi      # 0x192d4
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x32c(%rbp)
leaq -0x170(%rbp), %rdi
callq 0x3190
movb -0x32c(%rbp), %al
testb $0x1, %al
jne 0xeb80
jmp 0xed42
movq -0x2e0(%rbp), %rax
movq %rax, %rcx
addq $0x58, %rcx
movq %rcx, -0x340(%rbp)
movq (%rax), %rsi
leaq -0xc8(%rbp), %rdi
callq 0xbf20
movq %rax, -0x338(%rbp)
jmp 0xebad
movq -0x340(%rbp), %rdi
movq -0x338(%rbp), %rax
movq %rax, -0x178(%rbp)
leaq -0x178(%rbp), %rsi
callq 0xfc10
jmp 0xebd0
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x198(%rbp), %rdi
callq 0x15ec0
jmp 0xebe9
leaq -0x198(%rbp), %rdi
leaq 0xa9ab(%rip), %rsi      # 0x195a2
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x341(%rbp)
leaq -0x198(%rbp), %rdi
callq 0x3190
movb -0x341(%rbp), %al
testb $0x1, %al
jne 0xec22
jmp 0xec3c
leaq 0x127b7(%rip), %rsi     # 0x213e0
leaq -0xa0(%rbp), %rdi
callq 0x3050
jmp 0xec37
jmp 0xed3d
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x1b8(%rbp), %rdi
callq 0x15ec0
jmp 0xec55
leaq -0x1b8(%rbp), %rdi
leaq 0xa68f(%rip), %rsi      # 0x192f2
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x342(%rbp)
leaq -0x1b8(%rbp), %rdi
callq 0x3190
movb -0x342(%rbp), %al
testb $0x1, %al
jne 0xec8e
jmp 0xeca8
leaq 0x127ab(%rip), %rsi     # 0x21440
leaq -0xa0(%rbp), %rdi
callq 0x3050
jmp 0xeca3
jmp 0xed3b
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x1d8(%rbp), %rdi
callq 0x15ec0
jmp 0xecc1
leaq -0x1d8(%rbp), %rdi
leaq 0xa621(%rip), %rsi      # 0x192f0
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x343(%rbp)
leaq -0x1d8(%rbp), %rdi
callq 0x3190
movb -0x343(%rbp), %al
testb $0x1, %al
jne 0xecfa
jmp 0xed11
leaq 0x1279f(%rip), %rsi     # 0x214a0
leaq -0xa0(%rbp), %rdi
callq 0x3050
jmp 0xed0f
jmp 0xed39
movl $0x4, %edi
callq 0x3140
movq %rax, %rdi
movl $0x1, (%rdi)
leaq 0x11b0d(%rip), %rsi     # 0x20838
xorl %eax, %eax
movl %eax, %edx
callq 0x33a0
jmp 0xf12b
jmp 0xed3b
jmp 0xed3d
jmp 0xf047
leaq -0x1f8(%rbp), %rdi
leaq -0xc8(%rbp), %rsi
callq 0xc9b0
jmp 0xed57
leaq -0x1f8(%rbp), %rdi
leaq 0xa532(%rip), %rsi      # 0x19297
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x344(%rbp)
leaq -0x1f8(%rbp), %rdi
callq 0x3190
movb -0x344(%rbp), %al
testb $0x1, %al
jne 0xed93
jmp 0xeee7
movq -0x2e0(%rbp), %rax
movq %rax, %rcx
addq $0x58, %rcx
movq %rcx, -0x358(%rbp)
movq (%rax), %rsi
leaq -0xc8(%rbp), %rdi
callq 0xbf20
movq %rax, -0x350(%rbp)
jmp 0xedc0
movq -0x358(%rbp), %rdi
movq -0x350(%rbp), %rax
movq %rax, -0x200(%rbp)
leaq -0x200(%rbp), %rsi
callq 0xfc10
jmp 0xede3
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x220(%rbp), %rdi
callq 0x15ec0
jmp 0xedfc
leaq -0x220(%rbp), %rdi
leaq 0xa4e8(%rip), %rsi      # 0x192f2
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x359(%rbp)
leaq -0x220(%rbp), %rdi
callq 0x3190
movb -0x359(%rbp), %al
testb $0x1, %al
jne 0xee35
jmp 0xee4f
leaq 0x12624(%rip), %rsi     # 0x21460
leaq -0xa0(%rbp), %rdi
callq 0x3050
jmp 0xee4a
jmp 0xeee2
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x240(%rbp), %rdi
callq 0x15ec0
jmp 0xee68
leaq -0x240(%rbp), %rdi
leaq 0xa72c(%rip), %rsi      # 0x195a2
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x35a(%rbp)
leaq -0x240(%rbp), %rdi
callq 0x3190
movb -0x35a(%rbp), %al
testb $0x1, %al
jne 0xeea1
jmp 0xeeb8
leaq 0x12558(%rip), %rsi     # 0x21400
leaq -0xa0(%rbp), %rdi
callq 0x3050
jmp 0xeeb6
jmp 0xeee0
movl $0x4, %edi
callq 0x3140
movq %rax, %rdi
movl $0x1, (%rdi)
leaq 0x11966(%rip), %rsi     # 0x20838
xorl %eax, %eax
movl %eax, %edx
callq 0x33a0
jmp 0xf12b
jmp 0xeee2
jmp 0xf045
leaq -0x260(%rbp), %rdi
leaq -0xc8(%rbp), %rsi
callq 0xc9b0
jmp 0xeefc
leaq -0x260(%rbp), %rdi
leaq 0xa3a9(%rip), %rsi      # 0x192b3
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x35b(%rbp)
leaq -0x260(%rbp), %rdi
callq 0x3190
movb -0x35b(%rbp), %al
testb $0x1, %al
jne 0xef38
jmp 0xf01b
movq -0x2e0(%rbp), %rax
movq %rax, %rcx
addq $0x58, %rcx
movq %rcx, -0x370(%rbp)
movq (%rax), %rsi
leaq -0xc8(%rbp), %rdi
callq 0xbf20
movq %rax, -0x368(%rbp)
jmp 0xef65
movq -0x370(%rbp), %rdi
movq -0x368(%rbp), %rax
movq %rax, -0x268(%rbp)
leaq -0x268(%rbp), %rsi
callq 0xfc10
jmp 0xef88
movq -0x2e0(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x288(%rbp), %rdi
callq 0x15ec0
jmp 0xefa1
leaq -0x288(%rbp), %rdi
leaq 0xa341(%rip), %rsi      # 0x192f0
callq 0x30b0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x371(%rbp)
leaq -0x288(%rbp), %rdi
callq 0x3190
movb -0x371(%rbp), %al
testb $0x1, %al
jne 0xefda
jmp 0xeff1
leaq 0x124df(%rip), %rsi     # 0x214c0
leaq -0xa0(%rbp), %rdi
callq 0x3050
jmp 0xefef
jmp 0xf019
movl $0x4, %edi
callq 0x3140
movq %rax, %rdi
movl $0x1, (%rdi)
leaq 0x1182d(%rip), %rsi     # 0x20838
xorl %eax, %eax
movl %eax, %edx
callq 0x33a0
jmp 0xf12b
jmp 0xf043
movl $0x4, %edi
callq 0x3140
movq %rax, %rdi
movl $0x1, (%rdi)
leaq 0x11803(%rip), %rsi     # 0x20838
xorl %eax, %eax
movl %eax, %edx
callq 0x33a0
jmp 0xf12b
jmp 0xf045
jmp 0xf047
jmp 0xf049
movq -0x10(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x2c8(%rbp), %rdi
callq *%rax
jmp 0xf05e
leaq -0x2a8(%rbp), %rdi
leaq -0x2c8(%rbp), %rsi
leaq -0xa0(%rbp), %rdx
callq 0xfc40
jmp 0xf07a
movq -0x2e0(%rbp), %rdi
addq $0x20, %rdi
leaq -0x2a8(%rbp), %rsi
callq 0x32a0
leaq -0x2a8(%rbp), %rdi
callq 0x3190
leaq -0x2c8(%rbp), %rdi
callq 0x3190
leaq -0xc8(%rbp), %rdi
callq 0xc990
leaq -0xa0(%rbp), %rdi
callq 0x3190
jmp 0xf0f5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
leaq -0x2c8(%rbp), %rdi
callq 0x3190
leaq -0xc8(%rbp), %rdi
callq 0xc990
leaq -0xa0(%rbp), %rdi
callq 0x3190
jmp 0xf0fe
addq $0x380, %rsp            # imm = 0x380
popq %rbp
retq
movq -0x2d8(%rbp), %rdi
callq 0x72e0
movq -0x2e8(%rbp), %rdi
callq 0xf660
movq -0x2f0(%rbp), %rdi
callq 0x3190
movq -0x20(%rbp), %rdi
callq 0x33d0
nopl (%rax,%rax)