Skip to main content
Glama
emicklei

melrōse musical expression player

by emicklei
util.go2.46 kB
package op import ( "bytes" "fmt" "strconv" "strings" "text/scanner" "github.com/emicklei/melrose/core" ) type int2float32 struct { at int float float32 } type int2int struct { from int to int } // "1 (4 5 6) 2 (4 5 6) 3 (4 5 6) 2 (4 5 6)" func parseIndices(src string) [][]int { ii := [][]int{} var s scanner.Scanner s.Init(strings.NewReader(src)) container := []int{} ingroup := false for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { switch tok { case '(': if len(container) > 0 { ii = append(ii, container) } container = []int{} ingroup = true case ')': if len(container) > 0 { ii = append(ii, container) } container = []int{} ingroup = false default: i, err := strconv.Atoi(s.TokenText()) if err == nil { if ingroup { container = append(container, i) } else { ii = append(ii, []int{i}) } } } } if len(container) > 0 { ii = append(ii, container) } return ii } // depreacted: use core.ReplacedAll func replacedAll(target []core.Sequenceable, from, to core.Sequenceable) []core.Sequenceable { return core.ReplacedAll(target, from, to) } // "1 (4 5 6) 2 (4 5 6) 3 (4 5 6) 2 (4 5 6)" func formatIndices(src [][]int) string { var b bytes.Buffer for i, each := range src { if i > 0 { fmt.Fprintf(&b, " ") } if len(each) == 1 { fmt.Fprintf(&b, "%d", each[0]) } else { fmt.Fprintf(&b, "(") for j, other := range each { if j > 0 { fmt.Fprintf(&b, " ") } fmt.Fprintf(&b, "%d", other) } fmt.Fprintf(&b, ")") } } return b.String() } // 1:-1, 3:-1 ,1:0,2:0,3:0,1:1,2:1 func parseIndexOffsets(s string) (m []int2int) { entries := strings.Split(s, ",") for _, each := range entries { kv := strings.Split(each, ":") ik, err := strconv.Atoi(strings.TrimSpace(kv[0])) if err != nil { continue } iv, err := strconv.Atoi(strings.TrimSpace(kv[1])) if err != nil { continue } m = append(m, int2int{from: ik, to: iv}) } return } // 1:1, 2:1.0, 3:0.5, 4:0.01625, 1:2, 1:4, 1:8, 1:16 func parseIndexFloats(s string) (m []int2float32) { entries := strings.Split(s, ",") for _, each := range entries { kv := strings.Split(each, ":") ik, err := strconv.Atoi(strings.TrimSpace(kv[0])) if err != nil { continue } iv, err := strconv.ParseFloat(strings.TrimSpace(kv[1]), 32) if err != nil { continue } m = append(m, int2float32{at: ik, float: float32(iv)}) } return }

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