Estou tentando usar as suas classes pra gerar nota��o musical a partir
do SC, mas estou empacado...
1) Baixei o zip folder com tudo a partir daqui:
https://github.com/smoge/LilyCollider
2) Coloquei todos os arquivos dentro do folder
~/share/SuperCollider/Extensions
3) Iniciei o SC e abri o arquivo LilyPitch.scd (que me pareceu uma
esp�cie de documenta��o?)
4) Tentei evaluar as primeiras linhas:
a = LilyPitch(13.5)
a.plot
a.template="doc"
a.template="minimal"
a.header
a.templateList
a.templateFile
a.template
A primeira d� certo, mas o resto d� erro (abaixo). Ser� que instalei
algo errado?
Obrigado!
Bruno
- - - -
a LilyPitch
ERROR: Primitive '_FileLength' failed.
Failed.
RECEIVER:
Instance of File { (093D6960, gc=80, fmt=00, flg=00, set=01)
instance variables [1]
fileptr : nil
}
CALL STACK:
MethodError:reportError 094A7880
arg this = <instance of PrimitiveFailedError>
Nil:handleError 094A7820
arg this = nil
arg error = <instance of PrimitiveFailedError>
Thread:handleError 094A77C0
arg this = <instance of Thread>
arg error = <instance of PrimitiveFailedError>
Thread:handleError 094A7760
arg this = <instance of Routine>
arg error = <instance of PrimitiveFailedError>
Object:throw 094A7700
arg this = <instance of PrimitiveFailedError>
Object:primitiveFailed 094A76A0
arg this = <instance of File>
File:readAllString 094A7640
arg this = <instance of File>
var string = nil
LilyShowableObj:header 094A75E0
arg this = <instance of LilyPitch>
var file = <instance of File>
var content = nil
LilyShowableObj:write 094A7580
arg this = <instance of LilyPitch>
var file = <instance of File>
< FunctionDef in Method LilyShowableObj:plot > (no arguments or variables)
Routine:prStart 094A74C0
arg this = <instance of Routine>
arg inval = 165.7240550518
Bruno, vou corrigir esse problema. Como ninguém usa esse lib a não ser
eu, às vezes algumas pastas ficam "hard coded", o que é *bem* ruim. Vou
atualizar ainda hoje para funcionar em qualquer sistema.
O que você pode fazer é editar o arquivo LilyShowableObj.sc, que é a
superclasse de todos as classes que podem ser "mostrados" em uma
partitura (notas, acordes, sequencias, ritmos etc.).
Mude principalmente o "var <>templatesFolder = " que é a pasta que você
coloca os "templates" do Lilypond. Os templates são os arquivos com
informações sobre o tamanho do papel, o tamanho da pauta, se é notação
proporcional ou não, e vários detalhes desse tipo.
LilyShowableObj : LilyObj {
var <>fileName = "~/.scly/sketch";
var <>pdfViewer = "xpdf -remote sclyserver"; /* "okular --unique" */
var <>midiPlayer = "kmid";
var <>textEditor = "emacsclient"; /* "frescobaldi"; */
var <>templatesFolder =
"/home/smoge/.local/share/SuperCollider/Extensions/LilyCollider/templates";
var <>template = "doc";
var <>lilyCmd= "lilypond";
Talvez precise criar uma pasta ~/.scly, que é onde os arquivos vão ser
criados. Costumava ser ~/Desktop, mas nem todo mundo possui essa pasta
necessariamente (eu, por exemplo =).
Talvez um arquivo de configuração será necessário. Algo para determinar
o visualizador padrão do PDF (xpdf, okular, evince, skim &c.) e o
tocador do arquivo midi (vlc, kmid, rosegarden, logic &c.) &c. Algo tipo
xdg-open funcionaria no mac?
Eu gosto do xpdf e do okular porque você pode alterar o pdf sem ter que
fechar e abrir o programa. O xpdf é particularmente rápido.
--
Bernardo Barros
Ah, lembrei porque eu fiz isso.
O jeito "mais correto" seria usar Plarform.
Como 'Platform.classLibraryDir', mas isso estava me dando um erro por
algum motivo e eu estava sem paciência nesse dia =)
Vou tentar corrigir
a pasta dos templates (por exemplo) ficaria algo como
Plarform.classLibraryDir ++ "/LilyCollider/templates"
Vou testar aqui.
--
Bernardo Barros
Oooops, na verdade é :
Platform.userExtensionDir ++ "/LilyCollider/templates"
--
Bernardo Barros
Obrigado!!
Depois que vc mudar de vez o código posso testar aqui também num outro
computador.
B
On 10/25/2011 02:12 PM, Bernardo Barros wrote:
> On 10/25/2011 01:57 PM, Bernardo Barros wrote:
>> Bruno, vou corrigir esse problema. Como ninguém usa esse lib a não ser
>> eu, às vezes algumas pastas ficam "hard coded", o que é *bem* ruim. Vou
>> atualizar ainda hoje para funcionar em sistema.
É, com o código 'genérico' eu estou tendo problemas de novo..
Por que será? Deve ser algo idiota. Se eu avalio
Platform.userExtensionDir ++ "/LilyCollider/templates"
Isso funciona, mas se ele coloco essa linha no código da classe
LilyShowableObj, sclang não inicia, não aceitando "Platform":
ERROR: Parse error
in file
'/home/smoge/.local/share/SuperCollider/Extensions/LilyCollider/LilyShowableObj.sc'
line 9 char 33:
var <>templatesFolder = Platform•.userExtensionDir ++
"/LilyCollider/templates";
var <>template = "doc";
Qualquer luz me avise.
--
Bernardo Barros
Pode ser que não tenha nada a ver, mas... me parece que o output de
Platform.user etc é o endereço resultante (folder path) SEM aspas. Será
que o
var <> templatesFolder =
não está esperando um path contido ENTRE aspas?
Ou será que o Platform não está sequer sendo evaluado nesse momento? (a
coisa pára antes?)
B
Qual o jeito certo de entrar com uma lista de midi notes do tipo
[ [ 60, 50 ], [ 48, 38 ], [ 60, 50 ], [ 48, 52 ], [ 60, 50 ], [ 48, 69 ] ]
Achei que isto funcionaria, mas não deu:
LilyChordSeq( [ [ 60, 50 ], [ 48, 38 ], [ 60, 50 ], [ 48, 52 ], [ 60, 50
], [ 48, 69 ] ] ).plot;
(tentei espiar o código do ChordSeq, mas não sei se entendi... ele só
aceita Chords como argumento? Não pode ser uma lista de arrays direto?]
B
Daria sim. LilyChordSeq é uma sequências de LilyChords, logo ele teria
que converter internamente essa Array de números para um LilyChord.
putThis.do { |i|
if(i.isKindOf(Array)) {
this.put(LilyChord(i))
};
SuperCollider não tem como checar se isso "é uma Array de Números" como
no Haskell [Number], então temos que chegar manualmente, senão algo pode
dar muito errado. =) Vou checar se há algum método de ver se todos os
elementos de uma Array são somente Números, depois coloco no github.
(Estou saindo para o Encontro! Té breve!!))
init { arg firstStuff;
chordArray = Array.new;
this.put(firstStuff);
}
put { arg putThis;
// if(this.includes(putThis).not) {
if(putThis.isKindOf(LilyChord)) {
chordArray = chordArray.add(putThis)
};
if(putThis.isKindOf(Array)) {
this.putArray(putThis)
};
//};
}
putArray { arg putThis;
putThis.do { |i|
if(i.isKindOf(LilyChord)) {
this.put(i)
};
}
}
--
Bernardo Barros
Oi Bruno, agora está funcionando. =)
--
Bernardo Barros
Só para avisar... eu também to usando a classe hehe...
Legal saber que estão mexendo ainda no código... quando precisarem de
ajuda avisem ai...
Abração
Rael
--
Prof. Ms. Rael Bertarelli Gimenes Toffolo
Laboratório de Pesquisa e Produção Sonora - LAPPSO
Departamento de Música - DMU
Universidade Estadual de Maringá - UEM
+55 44 3261-4092
Que legal,
O que vocês acham que seria útil?
Você usam Patterns? Acham interessante?
Nas minhas composições eu acho particularmente interessantes as
Compreensões de Listas para manipular ritmos.
Para alturas eu acho que para coisas mais complexas os Patterns parecem
ser mais apropriados. Eles são inspirados na propramação funcional (como
Haskell), onde pode-se trabalhar com "listas infinitas" (streams) e
funções de alto nível (passar uma função como argumento para outra
função). Para mim parece interessante para trabalhar com alturas.
Isso também facilitaria implementar a utilização de ritmos + alturas, já
que poderia basear tudo em ritmo e chamar a "próxima altura" com "next".
--
Bernardo Barros
Rael: Como você tem usado?
Guilherme: Teoricamente pode ser, não? Mas o Xenakis falou isso mesmo?
Patterns em SC e streams/listas infinitas/funções de alto nível em
Haskell têm coisas em comum, mas não são a mesma coisa. Seria bacana
comparar. Você tem dado uma olhada nessas coisas, Guilherme? Lembro que
você comentou algo sobre Haskell uns meses atrás.
Uma coisa que estou tentando fazer agora é implementar a
"indispensabilidade" de ritmos que o Clarence Barlow propôs. Acho uma
ideia muito boa, eu gostaria de generalizá-la um pouco mais para
combinar com as árvores rítmicas. Por exemplo: subdividir um valor em
uma árvore rítmica com um algoritmico inspirado na indispensabilidade.
Se alguém quiser ajudar a implementar a indispensabilidade seria bem
bacana. Eu tenho o artigo do Barlow em PDF, caso alguém queira ler e ajudar.
Abraço!!
--
Bernardo Barros
Eu tenho usado como CAC mesmo... gerando notas e rítimos a partir de
arrays e cálculos matemáticos...
Seria legal implementar os rítmos como alturas também...
Pelo que vi vc comentando (apesar de eu não conhecer o Haskell) acho que
os Events no SC são realmente muito poderosos. Fiquei pensando em uma
maneira de comunicá-los diretamente com tuas classes. Estava pensando
em trabalhar um pouco nisso. Não deu muito tempo ainda que estou as
voltas de preparar algumas coisas para minha qualificação do doutorado.
ABração
Olá Rael,
Eu fiz uma outra classe que transforma um Pattern em um arquivo do
FOMUS, ele funciona muito melhor para alturas. O problema dele é que o
FOMUS não implementou árvores rítmicas, que é método que eu gosto de
trabalhar. Mas para alturas e ritmos como uma lista de durações, ele
funciona bem melhor.
https://github.com/smoge/superfomus
Boa sorte no doutorado! Qual a tese do seu trabalho?
Abraço!
--
Bernardo Barros