[#360221] Its a bird, its a plane, its.. um, an Attribute based System? — thunk <gmkoller@...>

15 messages 2010/04/01

[#360275] combined ranges... — Roger Pack <rogerpack2005@...>

Anybody know if there's an easy way to accomplish the equivalent of

26 messages 2010/04/02
[#360276] Re: combined ranges... — David Springer <dnspringer@...> 2010/04/02

Will this work:

[#360283] Re: combined ranges... — Roger Pack <rogerpack2005@...> 2010/04/02

David Springer wrote:

[#360285] Re: combined ranges... — Rick DeNatale <rick.denatale@...> 2010/04/02

On Fri, Apr 2, 2010 at 6:33 PM, Roger Pack <rogerpack2005@gmail.com> wrote:

[#360331] ThunkGen released! — Andrea Dallera <andrea@...>

Ahem...

98 messages 2010/04/03

[#360366] $SAFE=0 for setuid? — Rick Ashton <expiation@...>

Hi

17 messages 2010/04/04
[#360378] Re: $SAFE=0 for setuid? — Jonathan Nielsen <jonathan@...> 2010/04/04

> From most documentation I see that $SAFE is automatically set to 1 if

[#360381] Re: $SAFE=0 for setuid? — Rick Ashton <expiation@...> 2010/04/04

Jonathan Nielsen wrote:

[#360418] Novice school teacher seeking help in programming — Hilary Bailey <my77elephants@...>

I will like to know how to use programming languages to create a

20 messages 2010/04/05
[#360419] Re: Novice school teacher seeking help in programming — Jes俍 Gabriel y Gal疣 <jgabrielygalan@...> 2010/04/05

On Mon, Apr 5, 2010 at 5:23 PM, Hilary Bailey <my77elephants@gmail.com> wrote:

[#360420] Re: Novice school teacher seeking help in programming — Hilary Bailey <my77elephants@...> 2010/04/05

Jes炭s Gabriel y Gal叩n wrote:

[#360595] modifying a Hash in one process when .each is running in another — Nathan <njmacinnes@...>

I want one process to continually loop through a list of objects (in

11 messages 2010/04/07
[#360597] Re: modifying a Hash in one process when .each is running in another — Brian Candler <b.candler@...> 2010/04/07

Nathan Macinnes wrote:

[#360598] Re: modifying a Hash in one process when .each is running in another — Nathan <njmacinnes@...> 2010/04/07

Thanks for the clarification... My application is network based, and

[#360651] Is it possible, a fully general Enumerable#recursive ? — Intransition <transfire@...>

For the last couple of days I've been trying to write an Enumerable

28 messages 2010/04/07
[#360670] Re: Is it possible, a fully general Enumerable#recursive ? — David Masover <ninja@...> 2010/04/08

On Wednesday 07 April 2010 04:49:15 pm Intransition wrote:

[#360784] Re: Is it possible, a fully general Enumerable#recursive ? — Robert Dober <robert.dober@...> 2010/04/09

On Thu, Apr 8, 2010 at 5:51 AM, David Masover <ninja@slaphack.com> wrote:

[#360790] Re: Is it possible, a fully general Enumerable#recursive ? — Intransition <transfire@...> 2010/04/09

[#360898] Re: Is it possible, a fully general Enumerable#recursive ? — Robert Klemme <shortcutter@...> 2010/04/11

On 04/09/2010 08:53 PM, Intransition wrote:

[#360935] Re: Is it possible, a fully general Enumerable#recursive ? — Robert Dober <robert.dober@...> 2010/04/12

On Sun, Apr 11, 2010 at 10:55 PM, Robert Klemme

[#360945] Re: Is it possible, a fully general Enumerable#recursive ? — Robert Klemme <shortcutter@...> 2010/04/12

2010/4/12 Robert Dober <robert.dober@gmail.com>:

[#360760] The Ruid Concept, with question — thunk <gmkoller@...>

The Ruid Concept

32 messages 2010/04/09

[#360783] Ruby-warrior : Teaching AI concepts with Ruby — Aldric Giacomoni <aldric@...>

I think this project doesn't get enough attention :-)

24 messages 2010/04/09

[#360910] attr_accessor, but for a boolean — Albert Schlef <albertschlef@...>

Let's say I have this code:

13 messages 2010/04/12

[#360981] Method to groom a string to floating point representation — Alex DeCaria <alex.decaria@...>

I have a program that asks for the user to enter a string that

16 messages 2010/04/13
[#360986] Re: Method to groom a string to floating point representation — Josh Cheek <josh.cheek@...> 2010/04/13

On Mon, Apr 12, 2010 at 9:34 PM, Alex DeCaria <alex.decaria@millersville.edu

[#360994] Re: Method to groom a string to floating point representation — Alex DeCaria <alex.decaria@...> 2010/04/13

Josh Cheek wrote:

[#361047] Re: Method to groom a string to floating point representation — Josh Cheek <josh.cheek@...> 2010/04/14

On Tue, Apr 13, 2010 at 6:20 AM, Alex DeCaria <alex.decaria@millersville.ed=

[#361015] How to find multiple matches in a string — Alex DeCaria <alex.decaria@...>

I know how to use regular expressions to find the first match of a

11 messages 2010/04/13

[#361038] I thought spaces didn't matter around operators — Sarah Allen <sarah@...>

I had understood that operators, like minus (-), had special "syntactic

15 messages 2010/04/13

[#361055] Who maintains ruby-talk? — Tony Arcieri <tony.arcieri@...>

Among other things, the ruby-talk MLM is rampant with security

70 messages 2010/04/14
[#361066] Re: Who maintains ruby-talk? — Robert Klemme <shortcutter@...> 2010/04/14

2010/4/14 Tony Arcieri <tony.arcieri@medioh.com>:

[#361079] Re: Who maintains ruby-talk? — Tony Arcieri <tony.arcieri@...> 2010/04/14

On Wed, Apr 14, 2010 at 6:21 AM, Robert Klemme

[#361084] Re: Who maintains ruby-talk? — Josh Cheek <josh.cheek@...> 2010/04/14

On Wed, Apr 14, 2010 at 9:52 AM, Tony Arcieri <tony.arcieri@medioh.com>wrote:

[#361138] Re: Who maintains ruby-talk? — Justin Collins <justincollins@...> 2010/04/14

Tony Arcieri wrote:

[#361155] Re: Who maintains ruby-talk? — Tony Arcieri <tony.arcieri@...> 2010/04/15

On Wed, Apr 14, 2010 at 4:18 PM, Justin Collins <justincollins@ucla.edu>wrote:

[#361159] Re: Who maintains ruby-talk? — Tony Arcieri <tony.arcieri@...> 2010/04/15

On Wed, Apr 14, 2010 at 11:54 PM, Tony Arcieri <tony.arcieri@medioh.com>wrote:

[#361209] Re: Who maintains ruby-talk? — Walton Hoops <walton@...> 2010/04/15

On 4/15/2010 12:00 AM, Tony Arcieri wrote:

[#361141] Is this good OOP structuring? — Derek Cannon <novellterminator@...>

Hello everyone. I'm trying to get a hang of object-oriented programming

14 messages 2010/04/15
[#361157] Re: Is this good OOP structuring? — Robert Klemme <shortcutter@...> 2010/04/15

On 15.04.2010 02:46, Derek Cannon wrote:

[#361242] Re: Is this good OOP structuring? — Robert Dober <robert.dober@...> 2010/04/15

On Thu, Apr 15, 2010 at 8:00 AM, Robert Klemme

[#361254] Re: Is this good OOP structuring? — Derek Cannon <novellterminator@...> 2010/04/16

>class CourseController

[#361279] Writing a parser — Martin Hansen <mail@...>

Hello there,

18 messages 2010/04/16

[#361322] iconv transfer code — Pen Ttt <myocean135@...>

in my computer(ubuntu9.1+ruby1.9):

14 messages 2010/04/17
[#361372] Re: iconv transfer code — Brian Candler <b.candler@...> 2010/04/18

Pen Ttt wrote:

[#361366] Elegant Solution to a Seemingly Simple Problem? — Derek Cannon <novellterminator@...>

Hello everyone. It's me: Derek, again! Sorry for writing a novel here,

12 messages 2010/04/18

[#361396] ruby 1.9+ , floats, and decimal — botp <botpena@...>

> 0.2-0.1

18 messages 2010/04/19
[#361399] Re: ruby 1.9+ , floats, and decimal — Christopher Dicely <cmdicely@...> 2010/04/19

On Sun, Apr 18, 2010 at 8:07 PM, botp <botpena@gmail.com> wrote:

[#362518] Re: ruby 1.9+ , floats, and decimal — Rick DeNatale <rick.denatale@...> 2010/05/11

On Mon, Apr 19, 2010 at 1:24 AM, Christopher Dicely <cmdicely@gmail.com> wrote:

[#361454] DrX, an object inspector — "Mooffie n/a" <mooffie@...>

DrX is an object inspector (and a source-code browser).

32 messages 2010/04/20
[#361470] Re: [ANN] DrX, an object inspector — David Espada <davinciSINSPAM@...> 2010/04/20

El martes 20 de abril, Mooffie n/a escribi坦:

[#361504] Re: DrX, an object inspector — "Mooffie n/a" <mooffie@...> 2010/04/21

David Espada wrote:

[#361459] [RFC] Proposing a Ruby Packaging Standard — Christian Neukirchen <chneukirchen@...>

Hello,

34 messages 2010/04/20
[#361487] Re: [RFC] Proposing a Ruby Packaging Standard — Suraj Kurapati <sunaku@...> 2010/04/20

Hi,

[#361528] Ruby 1.9.1, Threads and "[BUG] The handle is invalid." — John Briggs <aazman.w@...>

Hi!

11 messages 2010/04/21

[#361587] Best way to write this method? — Derek Cannon <novellterminator@...>

Could my code below be more Ruby-esque or simpler (using Ruby methods I

13 messages 2010/04/22
[#361625] Re: Best way to write this method? — Derek Cannon <novellterminator@...> 2010/04/23

If you guys need some better clarification as to what these methods do:

[#361631] Re: Best way to write this method? — Robert Klemme <shortcutter@...> 2010/04/23

2010/4/23 Derek Cannon <novellterminator@gmail.com>:

[#361688] Segmentation fault at raise exception. — O01eg Oleg <o01eg@...>

I get segfault at any Ruby exception with C API:

13 messages 2010/04/24

[#361755] Networking: select() blocks for seconds (> timeout) — Raul Parolari <raulparolari@...>

I am using Ruby (as a prototype version) to communicate with a network

27 messages 2010/04/26
[#361833] Re: Networking: select() blocks for seconds (> timeout) — Caleb Clausen <vikkous@...> 2010/04/27

On 4/25/10, Raul Parolari <raulparolari@gmail.com> wrote:

[#361845] Re: Networking: select() blocks for seconds (> timeout) — Raul Parolari <raulparolari@...> 2010/04/27

Caleb Clausen wrote:

[#361888] Re: Networking: select() blocks for seconds (> timeout) — Caleb Clausen <vikkous@...> 2010/04/28

On 4/27/10, Raul Parolari <raulparolari@gmail.com> wrote:

[#365061] Re: Networking: select() blocks for seconds (> timeout) — Raul Parolari <raulparolari@...> 2010/06/30

I have some final results on the problem described.

[#365070] Re: Networking: select() blocks for seconds (> timeout) — Roger Pack <rogerpack2005@...> 2010/06/30

[#365078] Re: Networking: select() blocks for seconds (> timeout) — Raul Parolari <raulparolari@...> 2010/06/30

Roger Pack wrote:

[#365091] Re: Networking: select() blocks for seconds (> timeout) — Roger Pack <rogerpack2005@...> 2010/06/30

[#361896] Use of STDOUT.flush after puts — Alex DeCaria <alex.decaria@...>

I've seen several examples on this forum where folks have used

22 messages 2010/04/28
[#361897] Re: Use of STDOUT.flush after puts — Dave Baldwin <dave.baldwin@3dlabs.com> 2010/04/28

[#361916] Re: Use of STDOUT.flush after puts — Siep Korteling <s.korteling@...> 2010/04/29

Dave Baldwin wrote:

[#361917] Re: Use of STDOUT.flush after puts — Robert Dober <robert.dober@...> 2010/04/29

On Thu, Apr 29, 2010 at 9:16 AM, Siep Korteling <s.korteling@gmail.com> wrote:

[#361921] Re: Use of STDOUT.flush after puts — hemant <gethemant@...> 2010/04/29

On Thu, Apr 29, 2010 at 1:28 PM, Robert Dober <robert.dober@gmail.com> wrote:

[#361930] Re: Use of STDOUT.flush after puts — Robert Dober <robert.dober@...> 2010/04/29

On Thu, Apr 29, 2010 at 2:31 PM, hemant <gethemant@gmail.com> wrote:

[#361932] Re: Use of STDOUT.flush after puts — hemant <gethemant@...> 2010/04/29

On Thu, Apr 29, 2010 at 10:56 PM, Robert Dober <robert.dober@gmail.com> wro=

[#361936] Re: Use of STDOUT.flush after puts — Robert Dober <robert.dober@...> 2010/04/29

On Thu, Apr 29, 2010 at 8:25 PM, hemant <gethemant@gmail.com> wrote:

[#361962] Return values of modifiers — Michel Demazure <michel@...>

This is logical, but no very useful :

22 messages 2010/04/30
[#361968] Re: Return values of modifiers — Robert Klemme <shortcutter@...> 2010/04/30

2010/4/30 Michel Demazure <michel@demazure.com>:

[#361970] Re: Return values of modifiers — Michel Demazure <michel@...> 2010/04/30

Robert Klemme wrote:

[#361976] Re: Return values of modifiers — "David A. Black" <dblack@...> 2010/04/30

Hi --

[#361978] Re: Return values of modifiers — Michel Demazure <michel@...> 2010/04/30

David A. Black wrote:

[#362010] Re: Return values of modifiers — Benoit Daloze <eregontp@...> 2010/04/30

Sure, it would be nice while/until loops return value of the last iteration,

[#361963] Switching dynamically between methods (inside modules) — "Paul A." <cyril.staff@...>

Hi,

9 messages 2010/04/30

[#361983] Inverse of stream parser — Brian Candler <b.candler@...>

I plan to parse a huge XML document (too big to fit into RAM) using a

14 messages 2010/04/30

[#361989] Cann't require UTF-8 files. — O01eg Oleg <o01eg@...>

When I require file with UTF-8 encoding I get error:

14 messages 2010/04/30
[#361997] Re: Cann't require UTF-8 files. — Caleb Clausen <vikkous@...> 2010/04/30

On 4/30/10, O01eg Oleg <o01eg@yandex.ru> wrote:

[#362008] Setting to Ruby 1.9 in Ubuntu... — Xeno Campanoli / Eskimo North and Gmail <xeno.campanoli@...>

I tried installing a bunch of ruby 1.9 stuff on my Ubuntu laptop last night, but

15 messages 2010/04/30
[#362009] Re: Setting to Ruby 1.9 in Ubuntu... — Walton Hoops <walton@...> 2010/04/30

On 4/30/2010 1:36 PM, Xeno Campanoli / Eskimo North and Gmail wrote:

Re: [QUIZ] Music Theory (#229)

From: Daniel Moore <yahivin@...>
Date: 2010-04-03 17:25:51 UTC
List: ruby-talk #360334
Introduction

*This summary was written by Jean Lazarou.*

This quiz has some tricky aspects; translating a chord symbol to the notes
that it comprise may be ambiguous. The rule to follow when interpreting a
chord symbol may be different from one person to another and still be
correct.

As an example take the C major chord, one may expect three notes (C, E and
G). On a guitar you can produce 6 notes, on a piano you can produce 10
notes. Would you only play three notes? Another example: Cb on the piano
results in hitting the B key. Should a chord like Ab-Cb be rendered as Ab-B=
?
Have a look at the thread of discussion=85

Therefore, I am not considering all interpretation differences. I am not an
expert and I would probably be wrong.
Terminology

In the hope to make the summary clear, let=92s first present the terminolog=
y
we use.

The =91thing=92 the solution program expects as input is a chord symbol.

The chord symbol has a specific syntax. It starts with a note name, a lette=
r
from A to G, that we name the chord root. We can assign a pitch to the note=
,
a flat or a sharp. We write a flatted note by adding the lower case letter
=91b=92 and a sharped by adding the =91#=92 symbol.

After the root note follows the quality and the extension, they are a
limited set of strings defining what notes to include in the produced chord=
.
The rule to apply to get the notes is the same whatever the root note is. W=
e
are going to call it the modifier (Evan=92s term) or chord modifier.

Scales are sequences of notes, the basic sequence is for instance the C
major: C D E F G A B. We use degree to refer to the distance between notes,
for instance in the C scale, G is at a higher degree compared to C.
Solutions analysis

We see two trends in the solutions: three solutions defined classes, like
Note, and two went for a straight implementation of the solution. The
solutions with classes are intended to be musical APIs. They check if the
script is used as a main script to run in interactive mode. Typically code
expecting to run both as a utility and as a main script contain code like:

if __FILE__ =3D=3D $0
  # used as main script
end

All the solutions parse the chord input and validate it in some way. They
all use regular expressions but in different ways.
Ben Rho

Ben=92s code, that parses the chord symbol, uses an array notation where th=
e
index is a regular expression that returns a matching string or nil:

value =3D "hello"
p value[/hel/] # =3D> "hel"
p value[/aa/]  # =3D> nil

(not common to me)

He uses nested if statements with different regular expressions to validate
the chord symbol and builds the result at the same time. Using the root
note, he creates a note list as an array of possible notes sorted by degree
(either with sharps, either with flats). To define the array he uses a
standard array, then rotates the sequence so that the root note becomes the
first. The code looks like:

# define an array of note sequence
note_list =3D (%w(ab a bb b c db d eb e f gb g))

# map the note list to produce a rotated list
rotated_list =3D note_list.map { ... }

He uses a hash object that defines the =91chord library=92. The chord libra=
ry
maps the modifier to an array of indexes. The indexes give the sequence of
elements to select from the note list to build the chord. Each index being
an offset from the previous one.

Basically as the note list expresses all the semitones, the first index
gives the number of semitones between the root note and the first not to
appear in the chord. The next one gives the number of semitones between the
second note and the third one, and so on.

Because adding indexes may result in overflowing, he use a modulo 12 to
restart from 0.
David Springer

David=92s solution is pretty similar, except that his indexes are not
cumulative, they all give the offset from the root note.

He has a more complete list of modifiers.

Two differences are worth to notice. David does not use the regular
expression literals, supported by Ruby. He explicitly uses the Regexp class=
.
To combine alternative patterns he uses the union method:

sharps =3D Regexp.new("^[ACDFG]#")
flats =3D Regexp.new("^[ABDEG]b")
naturals =3D Regexp.new("^[A-G]")
get_root =3D Regexp.union(sharps,flats,naturals)

The second difference is that David does not rotate the arrays containing
the scale, to move the root note at the first position. He addresses the
items using modulo, after computing the position of the root note. He also
uses negative indexes to mark optional notes.
Evan Hanson

Evan defines several classes: Note, Chord and Key. He also extends the
Map class
with class level methods

He creates a Chord instance with the chord symbol as parameter. The
initializer parses the chord symbol and actually creates the result.

Because he accepts a combination of any number of modifiers, he tries to
match as much strings as possible, by removing one character from the
modifier string at a time, until it finds some match. Evan uses a hash
(dictionary) with the supported modifiers. The code searching for all the
modifiers looks like:

# duplicate entry so that next lines do not destroy the original modifier
mod =3D original_modifier.dup

# search for the longer match...
until chords_dictionary.include?(mod) or mod.empty? do
  mod.slice! -1 # remove last character
end

# retrieve the value associated with the modifier, if any
x =3D chords_dictionary[mod] unless mod.empty?

The values stored in the chord dictionary are arrays of method names. The
methods must be sent to a Note object. The methods return a note at some
interval (or distance) from the root note. Calling all the methods produces
the chord.

At the end he uses the uniq! method of the Chord class to remove any
duplicate note.
Brian Candler

Brian introduces one class, named Note. The class level scale method return=
s
the chord and the scale. A Note object has two attributes: the note
expressed as an index (A note is 0) and the distance from A (as semitones).

The scale method uses another class level method named parse. The parse met=
hod
returns a Note instance and the chord modifier. Again, the code validates
the modifier with a dictionary. The dictionary provides the scale in an
array of numbers, each number gives the number of semitones between the roo=
t
note and each note. Actually, dictionary entries may contain two other
arrays to add more notes in the scale and the notes making up the chord. Th=
e
code converts the array of semitones to an array of notes (strangely the
method making the conversion is also named scale but is not in the same
scope, instance method here).

Brian=92s dictionary contains a pretty complete list of modes.

Once he gets the scale, he selects the notes for the chord.

An interesting usage in parse is the call to new to create an instance. As
the method belongs to the Note class, the new method, with respect to the
current self, is the one in the class object.

def parse str
  # skip code
  [new(note, semi), $3]
end

Using new this way, instead of calling Note.new has the advantage of making
easier class renaming or copy-pasting code.
Jean Lazarou

The last solution is mine. It contains three classes: Note, Chord, and
Interval.

The Interval represents a distance and is expressed as a number of degrees
and a number of semitones. A Note has a name, an index (like Brian=92s inde=
x,
0 is A) and the pitch.

The Chord class parses a chord symbol in the initializer. It does not build
the solution, it stores the elements of the chord definition. The parsing
uses only one regular expression with the group options to retrieve each
element:

  # only part of the real regexp
  if @chord_symbol =3D~ /^([A-G])([#b]{0,1})(maj|m|mi|min|){0,1}$/
    puts "root note #{$1}"
    puts "pitch is #{$2}"
    puts "quality is #{$3}"
  end

As you see in the example above the expression has 3 groups: *[A-G]*, *[#b]=
*
 and*maj|m|mi|min*.

The Chord class has a dictionary providing arrays of intervals. When it
comes to generate the chord, the code calls the to_a method. to_a creates a=
n
array by adding each interval to the root note. The Note class overloads th=
e
add and subtract operators:

  def + interval
    # code here
  end

  def - interval
    # code here
  end

I also added tests to test the chord parsing, adding intervals to notes and
the chord generation. To make the tests easier to read I created constants
named A, B, C, etc.

Finally, I added a script to run a GUI version displaying the notes using
the score notation, see screenshot. It uses Swiby as the GUI layer on top o=
f
Java/Swing, that=92s why I wrote the solution as an API.
Comments

Reading the code with classes was not very easy.

I will not start a debate about API design, still I think some questions
should help in writing APIs:

   - What are the benefits of using them?
   - Should they be easy to understand?
   - Should they be intuitive to use?
   - Should they be helpful?
   - Should they allow doing different things or only a specific one?
   - Should the code extend existing classes?

Let=92s try to look at the solutions with the questions in mind.
Should they be easy to understand?

Brian=92s Note class contains a class level method named parse, it parses a
string and creates a Note object.
Should they be intuitive to use?

Evan has a class named Key. It contains a method named include? taking a
note as parameter and easy to guess what it is supposed to do: it returns
true if the given notes belongs to key.
Should they allow doing different things or only a specific one?

My Note class allows to add intervals to calculate another note. The featur=
e
is used to build the chord, it could also be used to generate sequences of
notes by applying rules like *oriental music* style or *jazz* style.
Should they be helpful?

The solution make use of their APIs and do not contains unused feature,
obviously they are helpful.
Conclusion

So, Steve, I would suggest that you make use of Brian=92s solution because =
it
seems to support more chords. But, I think you can rather easily improve or
enhance any of the solutions to meet your needs.


Music Theory (#229) - Solutions<http://rubyquiz.strd6.com/quizzes/229.tar.g=
z>

In This Thread

Prev Next