function createPassage( uint8[] userNotes, uint[] userDivider, NoteLength[] lengths )
        external
        payable
    {

        

        totalValue += msg.value;
        milestoneValue += msg.value;

        uint userNumberBeats = userDivider.length;
        uint userNumberLength = lengths.length;


        
        

        require( userNumberBeats == userNumberLength );

        require( msg.value >= ( minDonation * userNumberBeats ) );

        checkMidiNotesValue( userNotes );


        

        uint noteDonation = msg.value / userNumberBeats;
        uint lastDivider = 0;

        for( uint i = 0; i < userNumberBeats; ++ i ) {

            uint divide = userDivider[ i ];
            NoteLength length = lengths[ i ];

            uint8[] memory midiNotes = splice( userNotes, lastDivider, divide );

            Beat memory newBeat = Beat({
                maker: msg.sender,
                donation: noteDonation,
                midiNotes: midiNotes,
                length: length
            });

            lastDivider = divide;

            notes[ ++ numNotes ] = newBeat;

            emit NoteCreated( msg.sender, numNotes, noteDonation );

        }

        checkGoal( msg.sender );

    }