Skip to main content
Glama
emicklei

melrōse musical expression player

by emicklei
sequence_ops.go2.3 kB
package core func (s Sequence) Pitched(semitones int) Sequence { if len(s.Notes) == 0 { return s } if semitones == 0 { return s } groups := [][]Note{} for _, group := range s.Notes { changed := []Note{} for _, each := range group { changed = append(changed, each.Pitched(semitones)) } groups = append(groups, changed) } return Sequence{groups} } func (s Sequence) Stretched(f float32) Sequence { if len(s.Notes) == 0 { return s } groups := [][]Note{} for _, group := range s.Notes { changed := []Note{} for _, each := range group { changed = append(changed, each.Stretched(f)) } groups = append(groups, changed) } return Sequence{groups} } func (s Sequence) Reversed() Sequence { if len(s.Notes) == 0 { return s } groups := [][]Note{} for c := len(s.Notes) - 1; c != -1; c-- { groups = append(groups, s.Notes[c]) } return Sequence{groups} } func (s Sequence) Octaved(howMuch int) Sequence { if len(s.Notes) == 0 { return s } groups := [][]Note{} for _, group := range s.Notes { changed := []Note{} for _, each := range group { changed = append(changed, each.Octaved(howMuch)) } groups = append(groups, changed) } return Sequence{groups} } // TODO create op for this func (s Sequence) RotatedBy(howMany int) Sequence { if len(s.Notes) == 0 { return s } direction := Right if howMany < 0 { direction = Left howMany = -howMany } groups := s.Notes for c := 0; c < howMany; c++ { if direction == Left { first := groups[0] groups = append(groups[1:], first) } else { last := groups[len(groups)-1] groups = append([][]Note{last}, groups[:len(groups)-1]...) } } return Sequence{groups} } // Split return sequences with one-note groups. Merge would produce s again. func (s Sequence) Split() []Sequence { longest := 0 for _, each := range s.Notes { if len(each) > longest { longest = len(each) } } all := []Sequence{} for i := 0; i < longest; i++ { layer := []Note{} for j, each := range s.Notes { if i < len(each) { layer = append(layer, each[i]) } else { // take rest duration from first sequence one := all[0].Notes[j][0] if !one.IsPedal() { layer = append(layer, one.ToRest()) } } } all = append(all, BuildSequence(layer)) } return all }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/emicklei/melrose'

If you have feedback or need assistance with the MCP directory API, please join our Discord server