One thing you missed is that, in any case, finger trees give a quick insert at any index. They only directly allow you to insert from both ends, but they also provide quick separation and quick concatenation, so you can create a quick insert function anywhere like "split into two sequences, add to one of them, and then combine them again."
I say “theoretically” because finger trees rely on constant access to memory, but they generate far more cache misses than a simple vector, and often do not perform as well as you expected. Fingers are very fun to play with, but they are usually not used in clojure, and I would not recommend using them really.
One possibility is simply to continue slow operations. If your vectors are never very long, and performance is not critical, then the O (n) input operation will simply not matter much.
If this is not good, there is a solution that has the O (log (n)) attachment that you need, although it is not very fun. The answer is ... to simulate volatile pointers! This is an approach that often works: if the pointers were volatile, you can only have a linked list where each cell knows its two neighbors and updates them as needed when inserted. But you cannot here, because circular links are not suitable for functional data. But you can add a level of indirection: give each cell a unique “label” and store only the labels of its neighbors. Then you do not have round links, and you can do local updates cheaply. Here is an example of the layout I am describing, your C-major scale:
{:cell-data {0 {:left nil :right 1, :note :C3 :dur 1} 1 {:left 0 :right 2, :note :D3 :dur 1} 2 {:left 1 :right 3, :note :E3 :dur 1} 3 {:left 2 :right 4, :note :F3 :dur 1} 4 {:left 3 :right 5, :note :G3 :dur 1} 5 {:left 4 :right 6, :note :A4 :dur 1} 6 {:left 5 :right nil, :note :B4 :dur 1}} :first-node 0, :last-node 6}
The numbers are consistent here, but you can see how you could add a node between 5 and 6 by creating a new node with {:left 5 :right 6} and changing :right to node 5, and :left of node 6.
This organization is a complex problem, but it meets your needs.